C#Async/Await是否像中断一样工作?

Kic*_*Kim 3 c# multithreading asynchronous async-await

我测试了这样的控制台应用:

class Program
{
    static void Main(string[] args)
    {
        Test();

        Console.WriteLine("C");

        Console.ReadLine();
    }

    static async void Test()
    {
        Console.WriteLine("A");
        await Task.Delay(2000);
        Console.WriteLine("B");
    }
}
Run Code Online (Sandbox Code Playgroud)

该应用程序在2秒后立即打印A和C然后打印B. 看起来很好.但我读了一篇关于异步/等待"没有线程"的文章(http://blog.stephencleary.com/2013/11/there-is-no-thread.html),它说async/await不会创建额外的线.

回到我的控制台应用程序,我认为主线程在Console.ReadLine()上是blokced,所以在Console.ReadLine()之前不会执行Test()(Console.WriteLine("B")中的剩余代码.完成.但实际结果不同,无论主线程阻塞如何,都会执行剩余代码.

我想知道await的作用就像CPU中断一样,所以指令指针移动到剩余代码(Console.WriteLine("B");)并在执行后移回到中断位置(Console.ReadLine();)?

Dam*_*ver 6

与Windows窗体应用程序不同,控制台应用程序没有单个"祝福"线程(UI线程).因此,在控制台应用程序中默认不使用特殊的同步上下文,因此await实际使用线程池调度使用的延续.

因此,不需要"中断"当前正在等待的线程Console.ReadLine- 而是使用另一个线程.