Я создал эксперимент (запущенный в XUnit) для проверки вывода. Я использую три метода - тестовый метод, асинхронный метод, который вызывает await, и внутреннюю задачу, которая спит в течение 5 секунд.
[Fact]
public void TestAsyncRunning()
{
_testOutput.WriteLine("Beginning Test");
_testOutput.WriteLine("Calling RunningAsync");
var t = RunningAsync();
_testOutput.WriteLine("In outer method, after calling async method");
t.Wait(); //IOW, Thread.Join();
_testOutput.WriteLine("Exiting Test");
}
private async Task RunningAsync()
{
_testOutput.WriteLine("RunningAsync: Enter Method");
_testOutput.WriteLine("RunningAsync: Calling and awaiting inner running");
await InnerRunning();
_testOutput.WriteLine("RunningAsync: Returning");
}
private Task InnerRunning()
{
_testOutput.WriteLine("InnerRunning: Begin method");
_testOutput.WriteLine("InnerRunning: Sleeping For 5 seconds");
var t = Task.Run(() => Thread.Sleep(5000));
_testOutput.WriteLine("InnerRunning: Wake up and exit");
return t;
}
В следующих выходных данных строки со звездочками указывают на неожиданный порядок.
Ожидаемый вывод:
Beginning Test
Calling RunningAsync
RunningAsync: Enter Method
RunningAsync: Calling and awaiting inner running
InnerRunning: Begin method
InnerRunning: Sleeping For 5 seconds
*In outer method, after calling async method
*InnerRunning: Wake up and exit
RunningAsync: Returning
Exiting Test
Вывод, который я получаю
Beginning Test
Calling RunningAsync
RunningAsync: Enter Method
RunningAsync: Calling and awaiting inner running
InnerRunning: Begin method
InnerRunning: Sleeping For 5 seconds
*InnerRunning: Wake up and exit
*In outer method, after calling async method
RunningAsync: Returning
Exiting Test
Похоже, что метод asyn c на самом деле работает asyn c но метод, который он вызывает, работает синхронно. Это связано с TaskScheduler? Я явно что-то упускаю ...….