Почему async/await выполняются синхронно? - C#
Формулировка задачи:
Добрый день, Гуру!
Немного запутался в логике работы async/await, очень прошу просветить..)
Есть несколько асинхронных методов, выполняющихся синхронно в одном таске, хотелось бы понять почему.
Как я это понимаю:
-В строке 1 синхронно запускается метод MethodCaller()
-В строке 2 MethodCaller() возвращает в Main() незавершенный Task и запускает MethodA() в новом потоке, в то время как основной поток выполняет строку 3.
Но все выполняется полностью синхронно, т.е. строка 3 выполняется последней. Почему?
P.S. И еще один вопрос: асинхронные методы идут каскадом, скажем, десяток асинхронных методов дергает один другой. При каждом встреченном await из пула будет извлекаться поток?
Листинг программы
- private static void Main()
- {
- MethodCaller(); //1
- Console.WriteLine($"Task - {Task.CurrentId}: Main do work"); //3
- Console.ReadKey();
- }
- private static async Task MethodCaller()
- {
- Console.WriteLine($"Task - {Task.CurrentId}: Start MethodCaller()");
- var myNum = await MethodA(); //2
- Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodCaller(), {myNum}");
- }
- private static async Task<int> MethodA()
- {
- Console.WriteLine($"Task - {Task.CurrentId}: Start MethodA()");
- var result = await MethodB();
- Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodA()");
- return result;
- }
- private static async Task<int> MethodB()
- {
- Console.WriteLine($"Task - {Task.CurrentId}: Start MethodB()");
- var randomNumber = new Random().Next(5, 10);
- Console.WriteLine($"Task - {Task.CurrentId}: Finish MethodB()");
- return randomNumber;
- }
Решение задачи: «Почему async/await выполняются синхронно?»
textual
Листинг программы
- CancellationTokenSource cancelTokSrc = new CancellationTokenSource();
- Task tsk = Task.Factory.StartNew(MethodCaller, cancelTokSrc.Token, cancelTokSrc.Token); //1
- try
- {
- cancelTokSrc.Cancel();
- tsk.Wait();
- }
- catch(AggregateException aex)
- {
- // todo:
- }
- catch (Exception ex)
- {
- }
- finally
- {
- tsk.Dispose();
- cancelTokSrc.Dispose();
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д