Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么一个基本的单线程c#控制台应用程序需要3个线程?_C#_.net_Multithreading_Console - Fatal编程技术网

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

为什么一个基本的单线程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应用程序,我相信除了主线

我在c#中创建了一个控制台应用程序,其中包含一条
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;
        }));
     }

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

  • 垃圾收集器
  • 定稿
  • 线程池
这三个线程是否共享一个stdin


理论上是的,但其他人不会使用它,除非您在析构函数或ThreadPool.QueueUserWorkItem中使用Console.ReadLine,所以不要担心您将在主线程中获得所有数据。如果您没有执行任何线程或ThreadPool工作,那么这些线程中只有一个是您的。其余部分由运行时及其库(如垃圾收集)创建。线程的数量取决于您使用的库、内核的数量等


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

我假设执行.NET运行时就是它们的目的,但我无法用任何特定知识支持该断言。没有终结器线程;但是,有一个GC线程。@Samuel:全名实际上是GC终结器线程,或者至少谷歌是这么说的。被接受的答案在5mn的初始时间段内被编辑以添加GC,它在其原始版本中没有,因此我的答案。嗯,是的,有一个终结器线程。它在后台以低优先级运行,以处理GC设置的队列。GC本身不一定在应用程序的单独线程中运行。