Вы неправильно используете парадигму asyn c. Вы немедленно ожидаете асинхронный вызов c, и в результате он действует так же, как синхронный метод. Идея асинхронного c метода заключается в том, что он начинает работать и работает в фоновом режиме, не блокируя выполнение других потоков. Это позволяет вам запускать много потоков одновременно, а затем возвращать их, когда вы будете готовы их использовать. Я очень рекомендую msft docs в этом случае. Они используют пример приготовления завтрака, в этом примере они делают это неправильно, так как вы в своем вопросе:
Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");
Task<Egg> eggsTask = FryEggs(2);
Egg eggs = await eggsTask;
Console.WriteLine("eggs are ready");
Task<Bacon> baconTask = FryBacon(3);
Bacon bacon = await baconTask;
Console.WriteLine("bacon is ready");
Task<Toast> toastTask = ToastBread(2);
Toast toast = await toastTask;
ApplyButter(toast);
ApplyJam(toast);
Console.WriteLine("toast is ready");
Juice oj = PourOJ();
Console.WriteLine("oj is ready");
Console.WriteLine("Breakfast is ready!");
Чтобы исправить это, вы должны вызвать Task.WhenAny () или Task.WhenAll () , Это позволяет вам запускать все задачи сразу и возвращать их после того, как они закончатся (или когда они завершатся sh). Это значительно улучшит вашу производительность.
static async Task Main(string[] args)
{
Coffee cup = PourCoffee();
Console.WriteLine("coffee is ready");
var eggsTask = FryEggsAsync(2);
var baconTask = FryBaconAsync(3);
var toastTask = MakeToastWithButterAndJamAsync(2);
var allTasks = new List<Task>{eggsTask, baconTask, toastTask};
while (allTasks.Any())
{
Task finished = await Task.WhenAny(allTasks);
if (finished == eggsTask)
{
Console.WriteLine("eggs are ready");
}
else if (finished == baconTask)
{
Console.WriteLine("bacon is ready");
}
else if (finished == toastTask)
{
Console.WriteLine("toast is ready");
}
allTasks.Remove(finished);
}
Juice oj = PourOJ();
Console.WriteLine("oj is ready");
Console.WriteLine("Breakfast is ready!");
async Task<Toast> MakeToastWithButterAndJamAsync(int number)
{
var toast = await ToastBreadAsync(number);
ApplyButter(toast);
ApplyJam(toast);
return toast;
}
}