我在c#中使用单个Console.ReadLine
语句创建了一个控制台应用程序。在Visual Studio中运行此应用程序并进入调试器,在线程窗口中显示7个线程(6个工作线程,一个是.NET SystemEvents,另一个是vshost.RunParkingWindow
和主线程)。
当我在Visual Studio外部运行应用程序时,我在Windows任务管理器中看到总共3个线程。为什么这么多,我期待1个线程?产生的其他产品是什么?
答案 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)
如果你没有完成任何线程或线程池工作,那么这些线程中只有一个是你的。其余的由运行时和它的库创建,例如垃圾收集。线程数将根据您使用的库,核心数等而有所不同。
这些线程可以共享上下文,例如控制台,但您只需要担心同步自己的线程和构造。