调试期间的线程

问题描述 投票:0回答:2

有人可以向我解释一下为什么我的项目调试期间有这么多线程吗?

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

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

当我运行 Parallel.For 3 次迭代时,我得到以下线程:

[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 个额外的 No Name 线程?

c# multithreading debugging
2个回答
5
投票

您在 VIsual studio 托管进程下运行。它旨在增强您的调试体验。您列出的许多线程都来自该进程。

请参阅:Visual Studio 托管流程的目的是什么?

要禁用此功能 - 转至

Project Properties
> 在
Debug
选项卡中 > 取消选中
Enable the Visual Studio hosting Process

现在您的程序将作为自己的进程进行调试,您将看到正确的线程。基本应用程序将从主线程、终结器线程和几个线程池工作线程开始。工作线程将由 CLR 线程池创建和销毁,因为它认为合适。


1
投票

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

无名线程可能是您的并行线程,用于从 TPL 线程池中提取线程。 您可以更改调试选项以显示更多线程调试信息,我忘记了是怎么回事。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.