Почему 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();
}