当.NET控制台应用程序在Console.ReadLine()上阻塞时会发生什么?

ale*_*hev 9 .net c# multithreading

我今天有一个有趣的面试问题.考虑您有以下控制台应用程序:

static void Main(string[] args) 
{
    Console.WriteLine("Hello world");
    Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)

当达到Console.ReadLine()行时,执行被暂停,程序等待键盘的输入.此时有多少个线程以及它们处于什么状态,例如Running,Suspended等?

我想面试官所追求的是对构成.NET控制台应用程序的线程的认识/理解以及它们如何协同工作以与底层操作系统的IO子系统交互.

Lua*_*aan 12

没有明确的数字.

您的代码仅在一个线程上运行 - 主线程.调用Console.ReadLine不会创建一个新线程,它只是启动一个I/O请求并等待它被处理 - 这不需要线程,但由于你使用的是同步API,所以没有办法释放你的线程,所以它只是块.如果面试官只想要一个数字,这就是数字 - 它是你拥有的唯一应用程序线程,其他一切都是实现细节.

有很多基础设施线程 - 垃圾收集器线程是主要线程,其中一些线程一直在创建和销毁.

最后,介于两者之间的线程 - 最值得注意的是线程池.由于您没有使用线程池,因此它将具有默认的线程数 - 除非配置另有说明,这通常是每个逻辑CPU核心两个线程.

现实更深刻.例如,.NET线程是托管线程,它们可以在运行时意愿的"本机"线程之间跳过.但是,除非您正在编写自己的.NET运行时或操作系统,否则这是您永远不需要关心的事情:)或者,与依赖于本机线程关联的本机代码进行大量互操作(同样,不常见) .

我怀疑这个问题的主要目的是让你谈论Windows线程模型如何工作,.NET如何处理线程以及典型的Windows/.NET应用程序中的线程类型.但主要是,让你谈谈:P