c# - 进程线程(或整个进程)是否被挂起

标签 c# multithreading process

我想检查进程的线程(整个进程)是否被挂起。 我通过这段代码获取每个进程线程:

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/

相关文章:

c# - 如何滚动类似于 log4net 的 Serilog 文本文件?

c++ - 无法使用 #pragma omp parallel for 创建多个线程

database - 同时请求Grails org.hibernate.StaleObjectStateException

C#进程不接收输入

c# - 使用 AForge.Video.FFMPEG/AForge.Video.VFW 截屏视频。帧率问题

c# - 处理 Newtonsoft.JSON 中的 "(null)"值

c# - 在 C# 中,为什么在 finally block 的开头没有明确分配变量?

Java Tomcat,底层 Netty 线程没有停止

java - 从 Java 程序启动外部 Java 程序

c - 如何杀死一个pid不断变化的进程?