Использование WhenAny в асинхронном программировании на C#C#

Место общения программистов C#
Ответить
Anonymous
 Использование WhenAny в асинхронном программировании на C#

Сообщение Anonymous »

Я изучаю асинхронное программирование по документации Microsoft и не понимаю следующий пример, в котором используется метод WhenAny:

Код: Выделить всё

var breakfastTasks = new List { eggsTask, baconTask, toastTask };

while (breakfastTasks.Count > 0)
{
Task finishedTask = await Task.WhenAny(breakfastTasks);

if (finishedTask == eggsTask)
{
Console.WriteLine("Eggs are ready");
}
else if (finishedTask == baconTask)
{
Console.WriteLine("Bacon is ready");
}
else if (finishedTask == toastTask)
{
Console.WriteLine("Toast is ready");
}

await finishedTask;

breakfastTasks.Remove(finishedTask);
}
Вы можете найти его здесь.
Проблема этого кода в том, что eggTask ссылается на объект Task, baconTask ссылается на объект Task, а toastTask ссылается на объект Task.
Затем он помещает эти 3 переменные в список, который затем является аргументом в Task.WhenAny(breakfastTasks).
Я считаю, что используется неуниверсальная перегрузка WhenAny, которую вы можете увидеть здесь. В частности, я считаю, что используется эта перегрузка:

Код: Выделить всё

public static System.Threading.Tasks.Task WhenAny(System.Collections.Generic.IEnumerable tasks);
Как видите, параметр принимает IEnumerable. Кроме того, эта перегрузка возвращает объект Task, который после завершения становится объектом Task. Таким образом, в этом методе вы помещаете объекты Task, и когда один из них завершен, метод возвращает объект Task, который является единственным объектом Task, который завершился первым.
Однако, когда объект Task завершается, он становится объектом Egg, а когда объект Task завершается, он становится объектом Bacon объект, а когда объект Task завершается, он становится Объект Toast.
Итак, строка ниже кажется неправильной:

Код: Выделить всё

Task finishedTask = await Task.WhenAny(breakfastTasks);
Предположим, что eggTask завершается первым, он дает объект Egg, который должен быть возвращен методом, но после завершения метод возвращает только объект Task.
Не могли бы вы объяснить?

Подробнее здесь: https://stackoverflow.com/questions/778 ... in-c-sharp
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»