【问题标题】:Threads During Debug调试期间的线程
【发布时间】:2014-01-16 23:29:35
【问题描述】:

谁能给我解释一下为什么我的项目调试过程中有这么多线程?

我启动我的控制台应用程序 (.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 线程?

【问题讨论】:

  • 是什么阻止您查看这些线程的调用堆栈以了解它们在做什么? (可能需要取消选中“工具->选项->调试->“仅我的代码”)
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。

标签: c# multithreading debugging


【解决方案1】:

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

见:What is the purpose of the Visual Studio Hosting Process?

要禁用此功能 - 转到 Project Properties > 在 Debug 选项卡中 > 取消选中 Enable the Visual Studio hosting Process

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

【讨论】:

    【解决方案2】:

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

    无名线程可能是您的 parallel.for 从 TPL 线程池中提取线程。 您可以更改调试选项以显示更多线程调试信息我忘记了我的头顶。

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

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

    【讨论】:

    • 我以为 3 个“工作线程”线程来自 parallel.for?我知道你不需要知道这些东西,但我只是感兴趣。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 2012-03-26
    • 1970-01-01
    相关资源
    最近更新 更多