Асинхронные операции обрабатываются иначе, чем другие методы.
Упрощенное объяснение: ваш код ..
async static Task Main(string[] args)
{
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //thread id is 1 here
await DoSomethingAsync();
Console.WriteLine("do other workzzz");
Console.WriteLine(Thread.CurrentThread.ManagedThreadId); //thread id is 4 here
Console.ReadLine();
}
Выполняется следующим образом:
Вызывающий поток выполняет ..
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Код, ожидаемый оператором await
, отправляется планировщику задач, который использует контекст синхронизации для постановки в очередь, планирования и выполнения. Реализация контекста синхронизации отвечает за решение, в каком потоке этот код выполняется.
await DoSomethingAsync();
Код после await
отправляется обратно в контекст синхронизации, захваченный в начале. Опять же, в зависимости от реализации, какой-то другой поток может выполнить его.
Console.WriteLine("do other workzzz");
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
Console.ReadLine();
Несмотря на то, что код читается синхронно, шаблон async/await
прервет поток.