【问题标题】:How to check if process is not responding?如何检查进程是否没有响应?
【发布时间】:2011-03-30 20:40:41
【问题描述】:

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

问题是即使应用程序崩溃并且在 Manager 的列表中标记为“未响应”,Process.Responding 属性仍然返回“真”。

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

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

感谢您的宝贵时间。

【问题讨论】:

  • 其他进程是否有(可见的)主窗口?这是Process.Responding 要求的,请参阅msdn.microsoft.com/en-us/library/…
  • 我的应用程序需要检查其他进程,由用户在运行时定义。所以我不知道它是否是控制台应用程序。
  • 除了任务管理器启发式的 GUI 应用程序(IIRC:它是否及时处理 WN_NULL 消息)没有通用的方法来确定“挂起”(例如它可能正在等待某事或忙碌工作)。

标签: c# .net .net-3.5


【解决方案1】:

这个问题没有通用的解决方案。

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

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

可能的尝试可能是:

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

  2. 对于更一般的情况,一种可能的解决方案可能是每隔一段时间轮询进程的内存使用情况,如果在足够长的时间后它没有改变,则假定它已挂起。您可以使用Process.WorkingSet64 来执行此操作。但是,我预计这会导致一些误报 - 不处理任何内容的稳定进程可能会出现挂起。它还会导致误报,即存在内存泄漏的挂起进程似乎正在做一些有用的事情,而实际上它被困在一个循环中。

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

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

【讨论】:

  • 我在网上看了很长时间,试图找出线程化的 CMD.exe 进程是否返回了最终消息(通过RedirectStandardInputRedirectStandardOutput),似乎没有工作:Handle/Responding/thread.ThreadState... 所以我通过两次调用StandardInput.WriteLine 并第二次传递我的自定义字符串来解决它。这样我就可以调用一个告诉我进程处于空闲状态的事件。还使用while(true) 以固定时间间隔进行有争议的运行,从而可以知道是否收到了外部命令并将其排队等待执行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-06
  • 2022-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多