如何检查进程是否没有响应?

时间:2010-08-17 08:30:58

标签: c# .net .net-3.5

如果其他进程没有响应,是否有可能从代码中检查?

问题是,即使应用程序崩溃并且管理器列表中标记为“无响应”,Process.Responding属性仍然返回'true'。

如果流程是明确的,那么'退出'事件和函数'WaitForExit'会执行任何操作。所以这不是重点。

两个字的问题;我需要知道应用程序崩溃了。如何从代码中检查它?

感谢您的时间。

1 个答案:

答案 0 :(得分:20)

此问题没有一般解决方法。

无法判断特定进程是否挂起,因为术语“挂起”完全取决于正在执行的进程的上下文。

挂起过程将始终执行编码操作。开发人员可能对其编码很糟糕,但Windows不能对正确/错误做出假设。

尝试的可能想法可能是:

  1. Process.Responding调用将指示正在执行Windows消息循环的进程是否正在响应。

  2. 对于更一般的情况,一种可能的解决方案可能是每隔一段时间轮询进程的内存使用情况,如果在足够的时间后没有更改,则假设它已挂起。您可以使用Process.WorkingSet64执行此操作。但是,我希望这会导致一些误报 - 没有处理任何事情的稳定进程可能会出现问题。它还会导致漏报,其中有内存泄漏的挂起过程似乎在做一些有用的事情,而事实上它却陷入了循环中。

  3. 如果进程写入StandardError / StandardOutput流(尽可能多的控制台应用程序),那么您可以尝试侦听此类输出:Process.BeginOutputReadLineProcess.BeginErrorReadLine。如果在给定时间内没有这样的输出,您可能会推断它已经挂起。

  4. 但是你不会找到任何适用于一般情况的东西。