检测何时创建了新的托管线程

时间:2011-07-20 12:13:31

标签: c# .net

是否有人知道是否可以检测何时在托管环境中创建新线程?

我想在我的应用程序中列出所有线程(每个线程的ID和名称)。我在Visual Studio中使用Concurrency Visualizer,它只显示线程ID(而不是线程名称)。如果您有20多个没有其名称的线程,那么可视化程序流是非常困难的。

编辑: 使用Process.GetCurrentProcess()。线程不正常,因为CLR不保证托管和非托管线程之间的一对一映射。

一种解决方案是创建某种线程管理器,通过它可以完成所有线程创建。它还将管理所有当前活动线程的列表。

2 个答案:

答案 0 :(得分:4)

答案是否定你不能 - 你甚至无法枚举所有当前的“托管”线程,更不用说在创建/销毁一个线程时得到通知。

请参阅How can I enumerate all managed threads in C#?

注意:您可以使用Process类枚举流程中的所有主题:

Process.GetCurrentProcess().Threads

但这并不能告诉您哪些是“托管”的,并且在创建或销毁线程时不会通知您。

您可能会尝试通过查看托管线程的堆栈跟踪来确定哪些线程是“托管”的,但我真的不知道这是否真的适用于非托管线程,而且这一切都开始真正看起来dodgey!

new StackTrace().GetFrame(someThread)

只是为了澄清 - 你几乎肯定不应该做任何这个,只是一些背景。

答案 1 :(得分:1)

解决方案可能是在您创建线程时将其存储在Queue中,并定期检查Queue的内容。虽然不是一个完美的解决方案。