Как составить список асинхронных задач, добавляющих элементы в Наблюдаемую коллекцию?

#c# #asynchronous #async-await #observablecollection

Вопрос:

Я пытаюсь преобразовать следующий метод для параллельной работы:

 List<(DateTime start, DateTime end)> dates = CreateDateListTuple();

foreach ((DateTime start, DateTime end) date in dates)
        {
            dBInfos.Add(await GetDBInfo(date.start, date.end));
        }
 

То, что я пытался сделать, — это сначала создать список задач:

 List<Task<DBInfo>> parallelTasks = new List<Task<>>;

foreach((DateTime start,DateTime end) date in dates)
        {
            parallelTasks.Add(GetDBInfo(date.start, date.end));
        }
 

Затем выполните эти задачи параллельно:

 var continuation = await Task.WhenAll(parallelTasks.ToArray());
continuation.Wait();
 

Затем добавьте результаты в коллекцию:

 foreach (var result in continuation.Result)
        {
            dBInfos.Add(result);
        }
 

Что происходит, так это то, что программа зависает на

продолжение.Подожди();

команда, без каких-либо исключений. Что может быть не так с реализацией?

Комментарии:

1.Он Task.WhenAll может возвращаться Task<TResult[]> при вызове Task.WhenAll<Result>(...) задачи.Когда все() (dotnet 5)

2. Я обновил вопрос на основе этой информации, спасибо!

3. Каков тип continuation переменной? И почему .Wait() ? Почему .Result ? Не блокируйте асинхронный код .

Ответ №1:

Проблема была решена путем переписывания конца кода на:

         DBInfo[] continuation = await Task.WhenAll(parallelTasks.ToArray());

        foreach (DBInfo result in continuation)
        {
            dBInfos.Add(result);
        }