Задача.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 для каждой задачи и отменить их после возвращения первого. И даже несмотря на это, только в том случае, если стоимость этих операций фактически облагает систему налогом.