我想检查进程的线程(整个进程)是否被挂起。 我通过这段代码获取每个进程线程:
var threads = Proc.Threads;
for (int x = 0; x < threads.Count; x++) {
var thread = threads[x];
但是 System.Diagnostics.ThreadState
不包含 Suspended
,但是 System.Threading.ThreadState
包含。如何将 System.Diagnostics.ThreadState
转换为 System.Threading.ThreadState
,或者是否有其他方法来检查它?我不是要暂停/恢复它们,只是想知道 Process hacker/Process explorer 如何做到这一点。
最佳答案
Microsoft 在 .NET 1.0 版中犯了一个大错误,他们添加了 Thread.Suspend() 和 Resume() 方法。这些方法被广泛滥用,程序员使用它们来实现线程同步。他们是完全不合适的。问题是它通常 有效。但是在一个不幸的时间调用 Suspend() 并且您将卡住一个线程,同时它被埋在 Windows 调用中,持有全局锁。并导致整个程序死锁。
这不是他们犯的唯一设计错误,集合类上的 Synchronized 方法也是一场灾难。被广泛误解为“返回一个线程安全的集合”。
边学边学,这一切都在 .NET 2.0 中得到了修复。一项重大改革是 Thread 可能不再一定是操作系统线程,它从未真正实现过。但解释了为什么有 两个 ThreadState 枚举,一个用于 Thread(.NET 版本),另一个用于 ProcessThread(操作系统版本)。他们关闭了程序员滥用暂停/恢复的漏洞,这些方法被宣布为过时的。而且他们还关闭了后门,你无法从ProcessThread中发现线程被挂起。
功能,不是错误。不要犯同样的错误,知道一个线程被挂起是无用的知识,它很可能在一微秒后不再被挂起。
关于c# - 进程线程(或整个进程)是否被挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18268240/