我这样测试控制台应用程序:
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。看起来不错。但是我读了一篇关于异步/等待的文章“没有线程”(http://blog.stephencleary.com/2013/11/there-is-no-thread.html),它说异步/等待不会创建额外的线程。
所以回到我的控制台应用程序,我认为主线程在 Console.ReadLine() 上被阻塞了,所以 Test() (Console.WriteLine("B")) 中的剩余代码直到 Console.ReadLine 才会执行() 做完了。但实际结果不同,不管主线程是否阻塞,剩下的代码都会执行。
我想知道 await 的工作方式类似于 CPU 中断,所以指令指针移动到剩余代码(Console.WriteLine(“B”);)并在之后移动回中断位置(Console.ReadLine();)执行?
最佳答案
与 Windows 窗体应用程序不同,控制台应用程序没有单个“幸运”线程(UI 线程)。因此,没有特别的 synchronization context默认情况下在控制台应用程序中使用,因此 await
使用的延续实际上是使用线程池进行调度的。
因此无需“中断”当前正在等待 Console.ReadLine
的线程 - 而是使用另一个线程。
关于c# - C# Async/Await 是否像中断一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42154802/