调试期间的线程

4

请问为什么我在调试我的项目时会有那么多线程?

我启动我的控制台应用程序(.net 4.5),可以看到以下线程:

[8064][Thread Destroyed]
[5528]<No Name>
[9048]<No Name>
[1760]<No Name>
[6836]vshost.RunParkingWindow
[10200].NET SystemEvents
[9692]Main Thread

当我使用3次迭代运行Parallel.For时,我会得到以下线程:
[0]Thread Ended
[10140]<No Name>
[4464]<No Name>
[5332]<No Name>
[6772]vshost.RunParkingWindow
[8660].NET SystemEvents
[6728]Main Thread
[8580]Worker Thread
[9332]Worker Thread
[9168]Worker Thread
[1336]<No Name>
[9464]<No Name>

我假设这3个工作线程是为了我的Parallel.For循环中的3次迭代,但是:

  • 为什么会销毁一个线程?
  • 为什么没有命名的线程?
  • 什么是RunParkingWindow?
  • 为什么某些线程ID(例如主线程)会改变?
  • 为什么当我运行Parallel.For时会有额外的2个无名称线程?

3
你为什么不查看这些线程的调用堆栈以了解它们在做什么?(可能需要取消选中“工具->选项->调试->“仅限我的代码”) - Alexei Levenkov
我已经编辑了你的标题。请参考“问题的标题应该包含“标签”吗?”,在那里达成共识是“不应该”。 - John Saunders
2个回答

4
你正在Visual Studio托管进程下运行。这旨在增强调试体验。你列出的许多线程来自该进程。
参见:什么是Visual Studio Hosting Process的目的? 要禁用此功能- 转到项目属性 > 在调试选项卡中> 取消选中启用Visual Studio托管进程
现在,您的程序将以自己的进程进行调试,并且您将看到正确的线程。一个基本应用程序将从一个主线程、一个终结器线程和几个线程池工作线程开始。工作线程将由CLR线程池根据需要创建和销毁。

1

这些ID为[6772, 8660, 6728, 8580, 9332, 9168]的线程我认为是.Net框架线程。

没有名称的线程可能是您的Parallel.For从TPL线程池中提取的线程。 您可以更改调试选项以显示更多线程调试信息,我记不清了。

如果您的线程处理方式没有问题,您可能不需要花时间深入研究此问题,但也许您只是在研究框架。

正如Alexei所指出的那样,您可以在“工具->选项->调试->”我的代码仅限“中设置此信息


我以为并行.for中的3个“工作线程”线程是从哪里来的?我知道你不需要了解这些东西,但我只是感兴趣。 - David Klempfner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接