Почему async/await выполняются синхронно? - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день, Гуру! Немного запутался в логике работы async/await, очень прошу просветить..) Есть несколько асинхронных методов, выполняющихся синхронно в одном таске, хотелось бы понять почему. Как я это понимаю: -В строке 1 синхронно запускается метод MethodCaller() -В строке 2 MethodCaller() возвращает в Main() незавершенный Task и запускает MethodA() в новом потоке, в то время как основной поток выполняет строку 3. Но все выполняется полностью синхронно, т.е. строка 3 выполняется последней. Почему? P.S. И еще один вопрос: асинхронные методы идут каскадом, скажем, десяток асинхронных методов дергает один другой. При каждом встреченном await из пула будет извлекаться поток?
Листинг программы
  1. private static void Main()
  2. {
  3. MethodCaller(); //1
  4. Console.WriteLine($"Task - {Task.CurrentId}: Main do work"); //3
  5. Console.ReadKey();
  6. }
  7. private static async Task MethodCaller()
  8. {
  9. Console.WriteLine($"Task - {Task.CurrentId}: Start MethodCaller()");
  10. var myNum = await MethodA(); //2
  11. Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodCaller(), {myNum}");
  12. }
  13. private static async Task<int> MethodA()
  14. {
  15. Console.WriteLine($"Task - {Task.CurrentId}: Start MethodA()");
  16. var result = await MethodB();
  17. Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodA()");
  18. return result;
  19. }
  20. private static async Task<int> MethodB()
  21. {
  22. Console.WriteLine($"Task - {Task.CurrentId}: Start MethodB()");
  23. var randomNumber = new Random().Next(5, 10);
  24. Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodB()");
  25. return randomNumber;
  26. }

Решение задачи: «Почему async/await выполняются синхронно?»

textual
Листинг программы
  1.         CancellationTokenSource cancelTokSrc = new CancellationTokenSource();
  2.         Task tsk = Task.Factory.StartNew(MethodCaller, cancelTokSrc.Token, cancelTokSrc.Token); //1
  3.         try
  4.         {
  5.             cancelTokSrc.Cancel();
  6.             tsk.Wait();
  7.         }
  8.         catch(AggregateException aex)
  9.         {
  10.             // todo:
  11.         }
  12.         catch (Exception ex)
  13.         {
  14.  
  15.         }
  16.         finally
  17.         {
  18.             tsk.Dispose();
  19.             cancelTokSrc.Dispose();
  20.         }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.111 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут