查看,暂停和终止正在运行的.Net应用程序中的线程

时间:2020-03-06 14:26:16  来源:igfitidea点击:

我正在使用具有多个线程的.Net应用程序来做各种各样的事情。
当生产中出现问题时,我希望能够查看正在运行的线程(通过其托管名称),并能够暂停/杀死它们。

无论如何要实现这一目标?

VS并不总是可用的(尽管当时是一个不错的选择),而且WinDbg UI也不适合精打细算的人。

我考虑了一个程序内线程窗口,就像VS在调试时一样,但是找不到编程方式来执行此操作。 Process.GetThreads返回很少的可用数据。

解决方案

我们可以添加一个托管调试器来查看/冻结线程,或者如果我们想减轻重量,可以将WinDbg与SOS扩展一起使用。

.net中没有内置功能可以做到这一点。如果要以编程方式遍历活动线程,则必须在启动时在某个位置注册它们,或者在完成时注销它们,或者在对其进行操作之前对其进行过滤。我们对此做了一个版本,它需要大量的工作。

我们可以使用ProcessExplorer按ID和状态查看进程中正在运行的线程。

http://technet.microsoft.com/zh-cn/sysinternals/bb896653.aspx

使用"属性"窗口的"线程"选项卡。

我们还可以杀死线程并查看线程堆栈

远程调试呢?出于安全性考虑,设置起来可能有点麻烦,不过要确保我们具有正确的调试符号。

远程调试设置

查找线程:

using System.Diagnostics;

ProcessThreadCollection threads = Process.GetCurrentProcess().Threads;

通常,我们可以使用Thread.Abort()杀死托管线程。如果他们处于"睡眠","等待"或者"加入"状态,我们甚至可以摆脱(不太讨厌的)Thread.Interrupt()。