【问题标题】:Why 3 threads for a basic single threaded c# console app?为什么一个基本的单线程 c# 控制台应用程序需要 3 个线程?
【发布时间】:2010-10-20 05:23:39
【问题描述】:

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

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

【问题讨论】:

  • 我会假设执行 .NET 运行时是他们的目的,但我无法用任何具体知识支持该断言。

标签: c# .net multithreading console


【解决方案1】:

如果您正在运行 .NET 应用程序,我相信您总是会为 JIT(即时编译器)和 GC(垃圾收集)线程获得一个线程(主要是休眠),除了您的主线程。

【讨论】:

    【解决方案2】:

    您不必担心:如果您不明确使用它们,您的任何代码都不会在主线程之外的另一个线程中运行。其他线程用于:

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

    三个线程共享一个标准输入吗?

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

    【讨论】:

      【解决方案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;
              }));
           }
      

      【讨论】:

        【解决方案4】:

        不要忘记终结器线程!

        【讨论】:

        • 没有终结器线程这样的东西;但是,有一个 GC 线程。
        • @Samuel:全名实际上是 GC Finalizer Thread,或者至少 google 似乎是这么说的。接受的答案已在 500 万个初始时间范围内进行了编辑,以添加 GC,它在原始版本中没有,因此是我的答案。
        • 嗯,是的,有一个终结器线程。它在后台以低优先级运行以处理 GC 设置的队列。 GC 本身不一定在与您的应用程序分开的线程中运行。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 2016-05-26
          • 1970-01-01
          相关资源
          最近更新 更多