今天我有一个有趣的采访问题。考虑您有以下控制台应用程序:
static void Main(string[] args)
{
Console.WriteLine("Hello world");
Console.ReadLine();
}
当达到Console.ReadLine()行时,执行被暂停,程序等待键盘的输入。此时有多少个线程以及它们处于什么状态,例如跑步,暂停等?
我认为访谈者所追求的是对构成.NET控制台应用程序的线程的认识/理解以及它们如何协同工作以与底层操作系统的IO子系统交互。
答案 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 - >线程):
我为你的例子添加了一个新主题:
正在运行的代码:
static void Main(string[] args)
{
Console.WriteLine("Hello world");
new Thread(DoSomethingElse).Start();
Console.ReadLine();
}
private static void DoSomethingElse()
{
while (true)
{
Thread.SpinWait(100);
}
}
主题窗口: