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

时间:2009-04-17 21:44:21

标签: c# .net multithreading console

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

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

5 个答案:

答案 0 :(得分:36)

如果你正在运行一个.NET应用程序,我相信除了你的JIT(即时编译器)以及GC(垃圾收集)线程,你总是得到一个线程(主要是睡眠)主线。

答案 1 :(得分:5)

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

  • 垃圾收集器
  • 最终确定
  • 线程池
  

3个线程共享一个stdin吗?

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

不要忘记终结者线程!

答案 4 :(得分:1)

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

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