是否有人知道是否可以检测何时在托管环境中创建新线程?
我想在我的应用程序中列出所有线程(每个线程的ID和名称)。我在Visual Studio中使用Concurrency Visualizer,它只显示线程ID(而不是线程名称)。如果您有20多个没有其名称的线程,那么可视化程序流是非常困难的。
编辑:
使用Process.GetCurrentProcess()
。线程不正常,因为CLR不保证托管和非托管线程之间的一对一映射。
一种解决方案是创建某种线程管理器,通过它可以完成所有线程创建。它还将管理所有当前活动线程的列表。
答案 0 :(得分:4)
答案是否定你不能 - 你甚至无法枚举所有当前的“托管”线程,更不用说在创建/销毁一个线程时得到通知。
请参阅How can I enumerate all managed threads in C#?
注意:您可以使用Process
类枚举流程中的所有主题:
Process.GetCurrentProcess().Threads
但这并不能告诉您哪些是“托管”的,并且在创建或销毁线程时不会通知您。
您可能会尝试通过查看托管线程的堆栈跟踪来确定哪些线程是“托管”的,但我真的不知道这是否真的适用于非托管线程,而且这一切都开始真正看起来dodgey!
new StackTrace().GetFrame(someThread)
只是为了澄清 - 你几乎肯定不应该做任何这个,只是一些背景。
答案 1 :(得分:1)
解决方案可能是在您创建线程时将其存储在Queue
中,并定期检查Queue
的内容。虽然不是一个完美的解决方案。