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

4

我像这样测试了控制台应用程序:

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");
    }
}

这个应用程序在立即输出 A 和 C 后 2 秒钟才输出 B,看起来很正常。但我读到一篇有关 async/await 的文章 "There Is No Thread" (http://blog.stephencleary.com/2013/11/there-is-no-thread.html), 文章中说 async/await 不会创建额外的线程。
因此回到我的控制台应用程序,我认为主线程被 Console.ReadLine() 阻塞了,所以 Test() 中的其余代码 (Console.WriteLine("B")) 在 Console.ReadLine() 完成之前不会执行。但实际结果不同,无论主线程是否阻塞,其余代码都将执行。
我想知道 await 是否像 CPU 中断一样工作,使指令指针移动到剩余代码(Console.WriteLine("B");),然后在执行后返回中断位置(Console.ReadLine();)?

async/await 是异步工作的抽象。在某些情况下,实现基于CPU中断,在某些情况下它基于EPOLL,在某些情况下它可以基于线程同步原语。 - Aron
1
@KichangKim: 没有线程 解释了异步不一定要使用线程,对于 I/O 操作它通常不会阻塞线程。但是,当异步方法继续时,它必须在某个地方运行;我在我的异步介绍文章中描述了这种行为。 - Stephen Cleary
1个回答

5

与 Windows 表单应用不同,控制台应用程序没有单个“受保护”的线程(UI 线程)。因此,在控制台应用程序中,默认情况下不使用任何特殊的同步上下文,因此 await 使用的延续实际上是使用线程池计划的。

因此,无需“中断”当前等待 Console.ReadLine 的线程 - 另一个线程将被使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接