Код: Выделить всё
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);
Однако, когда объект Task завершается, он становится объектом Egg, а когда объект Task завершается, он становится объектом Bacon объект, а когда объект Task завершается, он становится Объект Toast.
Итак, строка ниже кажется неправильной:
Код: Выделить всё
Task finishedTask = await Task.WhenAny(breakfastTasks);
Не могли бы вы объяснить?
Подробнее здесь: https://stackoverflow.com/questions/778 ... in-c-sharp
Мобильная версия