Joh*_*ith 4 c# multithreading process
我想检查进程的线程(整个进程)是否被挂起.我通过以下代码获取每个进程线程:
var threads = Proc.Threads;
for (int x = 0; x < threads.Count; x++) {
var thread = threads[x];
Run Code Online (Sandbox Code Playgroud)
但System.Diagnostics.ThreadState不包含Suspended,但System.Threading.ThreadState确实如此.如何转换System.Diagnostics.ThreadState到System.Threading.ThreadState,或者是一些其他方法来检查呢?我不是想暂停/恢复它们,只是我想知道Process hacker/Process explorer是如何做到这一点的.
微软在.NET 1.0版中犯了一个大错误,他们添加了Thread.Suspend()和Resume()方法.这些方法被广泛滥用,程序员使用它们来实现线程同步.对他们来说完全不合适.问题是它通常有效.但是在不幸的时候调用Suspend()并且当它被埋在Windows调用中时你将冻结一个线程,持有一个全局锁.并导致整个程序陷入僵局.
这不是他们唯一的设计错误,集合类上的Synchronized方法也是一个灾难.被广泛误解为"返回线程安全的集合".
生活和学习,这一切都在.NET 2.0中得到修复.一个重大改进是Thread可能不再是操作系统线程,从未真正实现过.但解释了为什么有两个 ThreadState枚举,一个用于Thread(.NET版本),另一个用于ProcessThread(操作系统版本).他们关闭了滥用Suspend/Resume的程序员的漏洞,这些方法被宣布为过时的.他们也关闭了后门,你无法从ProcessThread中找到一个线程被挂起.
功能,而不是错误.不要犯同样的错误,知道线程被暂停是无用的知识,它可能不会在一微秒后暂停.
| 归档时间: |
|
| 查看次数: |
1190 次 |
| 最近记录: |