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操作,它通常不阻塞线程。然而,当异步方法继续时,它必须在某个地方运行;我用自己的语言描述了这种行为。