c# - C# 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.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/

相关文章:

c# - C# 中的运行时内联?

c# - C#Unity和C服务器中的TcpClient

java - 使用 Producer 读取大量文件会导致 CPU 使用率达到 100%

c++ - 多线程文件保存操作?

Javascript同步-等待setTimeOut完成,如果可能的话不回调

c# - 如何在Msbuild中使用Property函数找到当前工作目录盘符?

c# - 在 C# 中将字符串转换为日期时间时出错

c# - 如何使用 HttpWebRequest 发布数据?

asynchronous - 为什么 Async.StartChild 返回 `Async<Async<' T>>`?

python - 在 Tornado 中使用 gen.coroutine 的回调参数