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

时间:2016-06-15 11:46:57

标签: c# .net multithreading

今天我有一个有趣的采访问题。考虑您有以下控制台应用程序:

static void Main(string[] args) 
{
    Console.WriteLine("Hello world");
    Console.ReadLine();
}

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

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

2 个答案:

答案 0 :(得分:12)

没有明确的数字。

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

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

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

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

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

答案 1 :(得分:3)

我同意Luuan,因此,根据你的采访者的意思,除了主线程之外还有VisualStudio线程运行。顺便说一下,可以禁用此线程(在VS2015中:项目属性>调试选项卡>取消选中启用Visual Studio主机进程)

如果您使用的是Visual Studio,则应该能够在调试期间看到线程。

正在运行的代码:

static void Main(string[] args)
{
    Console.WriteLine("Hello world");           
    Console.ReadLine();
}

线程窗口(在VS2015中:调试 - > Windows - >线程):

enter image description here

我为你的例子添加了一个新主题:

正在运行的代码:

static void Main(string[] args)
{
    Console.WriteLine("Hello world");
    new Thread(DoSomethingElse).Start();            
    Console.ReadLine();
}

private static void DoSomethingElse()
{
    while (true)
    {
        Thread.SpinWait(100);
    }
}

主题窗口:

enter image description here