2012-10-13 61 views
20

所以,我有一个很简单的控制台应用程序:有多个线程?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.ReadKey(); 
    } 
} 

我已经发布配置构建它。当我运行它并打开任务管理器时,我看到它 有4个线程。即使我没有创建任何线程,为什么会发生这种情况?

这不可能是每个应用程序。我试过打开记事本,它只有1个线程。虽然它是一个本机应用程序,我的控制台应用程序是托管。

任何想法?

+0

您总是至少有1个GC +主线程的线程。 – driis

回答

17

我想象你看到线程是:

  1. 主线程
  2. 的终结日。读取
  3. In-process debugger helper thread
  4. 并行GC线程。

This post详细介绍了一些特殊的CLR线程。

+0

+1,非常不错的链接到博客文章 – sll

+0

谢谢你的链接。优秀的资源! – Aniket

6

这些是为应用程序创建的.NET Framework线程,您可以使用Visual Studio 2010线程调试窗口查看哪些线程属于该问题下的应用程序。

刚刚创建了一个基本的控制台应用程序与空main方法,我们可以看到,8个线程创建:

enter image description here

在这里看到关于CLR内螺纹有趣的讨论:The CLR's internal threads

BTW,记事本不是.NET Framework应用程序

+0

我知道,所以不可能创建一个单线程.NET应用程序? – Aniket

+0

我相信没有,因为你没有这种控制。NET框架的行为只是想知道是否有人知道这样做,我正在谈论托管应用程序,不确定关于非托管 – sll

+0

我可以确认本机应用程序(C/C++)只有一个线程。刚试过了。 – Aniket

3

.NET Framework始终在程序开始时启动一些线程:

  1. 你的主线程(显然)
  2. 垃圾收集线程
  3. JIT线程。
1

正常COM应用程序和托管应用程序之间有一个基本区别。这是垃圾收集。

每个进程都有一个与其关联的终结器线程,以便应用程序中的终结器仅在该线程上运行。

所以主题是: 1.主线程(应用程序创造) 2.终结器线程(由垃圾收集器使用 3. JIT线程(用于飞JIT代码)

的。其他线程可以SysEvents等