【问题标题】:How can I enumerate all managed threads in C#?如何枚举 C# 中的所有托管线程?
【发布时间】:2009-01-21 20:20:02
【问题描述】:

是否可以在 C# 中枚举所有托管线程?当您在调试时遇到断点时,Visual Studio 似乎能够做到这一点。在“线程”窗口中,它显示了所有正在运行的线程的列表,包括托管名称。有谁知道它是怎么做到的?

【问题讨论】:

  • @Marc:我认为必须有不同的方式,因为 VS 可以枚举它们。不过我可能最终会自己跟踪它们。
  • @Marc,我不同意。也许他正在开发 IDE 并希望包含调试功能。在这种情况下,“跟踪你自己的线程”不是一个有效的答案。该问题可以标记为重复,但“简短答案”不是最好的。
  • @Hosam Aly:好的,我会接受...我会回滚并重新发布作为回复

标签: c# multithreading


【解决方案1】:

调试器通常能够做“正常”代码做不到的事情。如果您使用分析/调试 API,您可能会发现您可以做到这一点,但我不相信您可以通过“普通”.NET 代码做到这一点。

【讨论】:

  • 我也不知道如何从调试器中执行此操作。调试器中给出的线程 id 似乎是 Win32 id 而不是托管线程 id。
  • @CrazyCasta:我并不是说你可以调试器明确地做到这一点。我是说当调试器确实列出所有线程时,它可以使用其他地方不可用的 API。即使它列出了 Win32 ids,它仍然显示托管线程 names,不是吗?
  • 我看到似乎是托管名称,但存在一些问题。 1. 可能是托管代码只是设置了非托管线程的名称。 2. 如前所述,非托管线程和托管线程之间没有明确的 1:1 相关性。每个非托管线程都可以在两个托管线程之间切换。 3. 我猜调试器只是在枚举非托管线程。
【解决方案2】:

这听起来像是“How to enumerate threads in .NET using the Name property?”的重复 - 如果是这样,简短的回答是“自己跟踪自己的线程” - 即在 List<Thread> 或类似的。

【讨论】:

  • 这就是我最终可能会做的事情,我只是希望已经有一些东西可以为我做这件事。 :)
【解决方案3】:

看看Managed Stack Explorer

MSE 通过快速附加到 堆栈跟踪时的处理 请求并分离第二个 堆栈跟踪已被检索。 这种方式的干扰 该过程的正常运行是 最小化。

不幸的是,这意味着它必须由外部进程完成。

类似的工具是StackDump,它使用MDbg 来生成转储。

【讨论】:

    【解决方案4】:

    您可以通过向ProcInsp 发出 HTTP GET 请求来枚举线程。 ProcInsp 允许您使用 CLR 进程的堆栈跟踪获取线程(在其 UI 中或作为 JSON 消息)。网络 API 位于/Process/%PID%/Threads

    免责声明:我是这个工具的开发者。它已获得 MIT 许可,可免费使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多