Почему 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(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д