Задача.WhenAny - что происходит с оставшимися запущенными задачами?
У меня есть следующий код:
List<Task<bool>> tasks = tasksQuery.ToList();
while (tasks.Any())
{
Task<bool> completedTask = await Task.WhenAny(tasks);
if (await completedTask)
return true;
tasks.Remove(completedTask);
}
запуск задач в параллельном режиме. Когда первая завершенная задача возвращает true, методы возвращают true.
мой вопрос:
что происходит со всеми оставшимися задачами, которые были запущены и, вероятно, все еще работают в фоновом режиме? это правильный подход для выполнения кода, который является асинхронным, параллельным и должен возвращаться после первого условия или лучше запустить их один за другим и ждать?
спасибо
1 ответов
кстати, я просто читаю параллелизм в C# CookBook, by Стивен Клири, а я могу сослаться на некоторые части Книги здесь, я думаю.
С Рецепт 2.5 - Обсуждение, мы
после завершения первой задачи подумайте, следует ли отменить оставшиеся задачи. Если другие задачи не отменяются, но также никогда не ждали, то они отказались. заброшенные задачи будут выполняться до завершения, и их результаты будут проигнорированы. Любые исключения из этих заброшенных задач также будут игнорироваться.
еще один антипаттерн для задачи.WhenAny обрабатывает задачи по мере их завершения. сначала кажется разумным подходом сохранить список задач и удалить каждую задачу из списка по мере ее завершения. Проблема с этим подходом заключается в том, что он выполняется в O(n^2) раз, когда существует алгоритм O(N).
кроме того, я думаю WhenAny
is конечно, правильный подход, просто подумайте о следующем Леонид приближение прохождения то же самое CancellationToken
для каждой задачи и отменить их после возвращения первого. И даже несмотря на это, только в том случае, если стоимость этих операций фактически облагает систему налогом.