我正在开发一个具有多个线程的.Net应用程序,可以执行各种操作。 当生产中出现问题时,我希望能够看到哪些线程正在运行(通过其托管名称),并且还能够暂停/终止它们。
无论如何要实现这个目标?
VS并不总是可用(虽然这是一个很好的选择),而WinDbg UI并不适合精灵。
我考虑过程序中的线程窗口,就像VS在调试时一样,但找不到编程方式来执行此操作。 Process.GetThreads返回的可用数据非常少。
答案 0 :(得分:3)
寻找线程:
using System.Diagnostics;
ProcessThreadCollection threads = Process.GetCurrentProcess().Threads;
您通常可以使用Thread.Abort()终止托管线程。如果他们在睡眠,等待或加入你甚至可以逃脱(不那么讨厌)Thread.Interrupt()。
答案 1 :(得分:2)
.net中没有内置任何内容可以做到这一点。如果要以编程方式迭代活动线程,则必须在启动时在某处注册它们,并在完成时取消注册它们或在对其执行操作之前对其进行过滤。我们做了一个版本,它需要一些非常重要的工作。
答案 2 :(得分:0)
如果你想要更轻的重量,你可以附加一个托管调试器来查看/冻结线程,或者使用带有SOS扩展的WinDbg。
答案 3 :(得分:0)
您可以使用ProcessExplorer按ID和状态查看进程中正在运行的线程。
http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
使用“属性”窗口的“线程”选项卡。
您还可以杀死线程并查看线程堆栈
答案 4 :(得分:0)
远程调试怎么样?由于安全性并确保您拥有正确的调试符号,因此设置可能有点挑剔。