为什么一个基本的单线程c#控制台应用程序需要3个线程?
我在c#中创建了一个控制台应用程序,其中包含一条为什么一个基本的单线程c#控制台应用程序需要3个线程?,c#,.net,multithreading,console,C#,.net,Multithreading,Console,我在c#中创建了一个控制台应用程序,其中包含一条console.ReadLine语句。在Visual Studio中运行此应用程序并进入调试器将在线程窗口中显示7个线程(6个工作线程,一个是.NET SystemEvents,另一个是vshost.RunParkingWindow和主线程) 当我在Visual Studio之外运行应用程序时,我在Windows任务管理器中看到总共3个线程。为什么这么多的时候我会期待一个线程?生成其他线程的目的是什么?如果您运行的是.NET应用程序,我相信除了主线
console.ReadLine
语句。在Visual Studio中运行此应用程序并进入调试器将在线程窗口中显示7个线程(6个工作线程,一个是.NET SystemEvents,另一个是vshost.RunParkingWindow
和主线程)
当我在Visual Studio之外运行应用程序时,我在Windows任务管理器中看到总共3个线程。为什么这么多的时候我会期待一个线程?生成其他线程的目的是什么?如果您运行的是.NET应用程序,我相信除了主线程之外,JIT(实时编译器)和GC(垃圾收集)线程总是有一个线程(大部分是休眠线程)。不要忘记终结器线程 有一种方法可以将SystemEvents通知程序移动到线程中:
public static class ThreadingHelper_NativeMethods
{
[DllImport("user32.dll")]
public static extern bool IsGUIThread(bool bConvert);
}
// This code forces initialization of .NET BroadcastEventWindow to the UI thread.
// http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/fb267827-1765-4bd9-ae2f-0abbd5a2ae22
if (ThreadingHelper_NativeMethods.IsGUIThread(false))
{
Microsoft.Win32.SystemEvents.InvokeOnEventsThread(new MethodInvoker(delegate()
{
int x = 0;
}));
}
您不必担心:如果不显式地使用它们,您的任何代码都不会在主线程之外的其他线程中运行。其他线程用于:
- 垃圾收集器
- 定稿
- 线程池
理论上是的,但其他人不会使用它,除非您在析构函数或ThreadPool.QueueUserWorkItem中使用Console.ReadLine,所以不要担心您将在主线程中获得所有数据。如果您没有执行任何线程或ThreadPool工作,那么这些线程中只有一个是您的。其余部分由运行时及其库(如垃圾收集)创建。线程的数量取决于您使用的库、内核的数量等
这些线程可能共享上下文,例如控制台,但您只需要担心同步您自己的线程和构造。我假设执行.NET运行时就是它们的目的,但我无法用任何特定知识支持该断言。没有终结器线程;但是,有一个GC线程。@Samuel:全名实际上是GC终结器线程,或者至少谷歌是这么说的。被接受的答案在5mn的初始时间段内被编辑以添加GC,它在其原始版本中没有,因此我的答案。嗯,是的,有一个终结器线程。它在后台以低优先级运行,以处理GC设置的队列。GC本身不一定在应用程序的单独线程中运行。