Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#Async/Await是否像中断一样工作?_C#_Multithreading_Asynchronous_Async Await - Fatal编程技术网

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

C#Async/Await是否像中断一样工作?,c#,multithreading,asynchronous,async-await,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.Del

我测试了控制台应用程序,如下所示:

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的文章“没有线程”(),它说async/await不会创建额外的线程

回到我的控制台应用程序,我认为主线程是在console.ReadLine()上阻塞的,因此Test()中的剩余代码(console.WriteLine(“B”)在console.ReadLine()完成之前不会执行。但实际结果不同,不管主线程阻塞情况如何,都会执行剩余代码


我想知道wait的工作原理与CPU中断类似,因此指令指针在执行后会移到剩余代码(Console.WriteLine(“B”)),并移回中断位置(Console.ReadLine();)。

与Windows窗体应用程序不同,控制台应用程序没有一个“受祝福的”线程(UI线程)。因此,在控制台应用程序中默认情况下不使用特殊,因此
await
使用的延续实际上是使用线程池进行调度的


因此,不需要“中断”当前正在
控制台上等待的线程。ReadLine
-使用另一个线程。async/await是异步工作的抽象。在某些情况下,实现基于CPU中断,在某些情况下基于EPOLL,在某些情况下可以基于线程同步原语。@KichangKim:解释异步如何不必使用线程,对于I/O操作,它通常不阻塞线程。然而,当异步方法继续时,它必须在某个地方运行;我用自己的语言描述了这种行为。