#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);
}