为什么3个线程用于基本的单线程c#控制台应用程序?

我使用一个Console.ReadLine语句在c#中创建了一个控制台应用程序。 在Visual Studio中运行此应用程序并进入调试器,在线程窗口中显示7个线程(6个工作线程,一个是.NET SystemEvents,另一个是vshost.RunParkingWindow和主线程)。

当我在Visual Studio外部运行应用程序时,我在Windows任务管理器中看到总共3个线程。 为什么这么多,我期待1个线程? 产生的其他产品是什么?

如果您正在运行.NET应用程序,我相信除了主线程之外,您总是会获得JIT(即时编译器)以及GC(垃圾收集)线程的线程(主要是hibernate)。

您不必担心:如果您没有明确使用它们,您将不会在主线程之外的其他线程中运行任何代码。 其他主题是:

  • 垃圾收集器
  • 定稿
  • 线程池

3个线程共享一个stdin吗?

理论上是的,但是其他人不会使用它,除非你在析构函数或ThreadPool.QueueUserWorkItem里面使用Console.ReadLine,所以不要担心你会在主线程中获得所有数据

有一种方法可以将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; })); } 

不要忘记终结者线程!

如果你没有完成任何线程或线程池工作,那么这些线程中只有一个是你的。 其余的是由运行时创建的,它的库是垃圾收集。 线程数将根据您使用的库,核心数等而有所不同。

这些线程可以共享上下文,例如Console,但您只需要担心同步自己的线程和构造。