gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:25:14 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com