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

标签 c# .net .net-3.5

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

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

“已退出”事件和函数“WaitForExit”会在进程明确退出时执行任何操作。所以这不是重点。

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

感谢您的宝贵时间。

最佳答案

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

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

挂起的进程将始终执行它被编码要做的事情。开发人员可能编码不当,但 Windows 无法假设什么是对/错。

可能的尝试可能是:

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

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

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

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

关于c# - 如何检查进程是否没有响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3500634/

相关文章:

c# - 您如何查看已注册的 httphandlers 的集合?

c# - 在批处理文件中包含一个批处理文件

c# - 将 DataGridView 的 DataSource 设置为 null/false 会删除 DataGridView 的所有默认设置

c# - 如何在 Windows Universal App 中使用双工 wcf 服务

c# - 如何组合两个表达式?

c# - 我在哪里可以找到有关创建线程时幕后发生的事情的信息?

c# - Windows窗体应用程序中数组的最小元素问题

c# - 找不到类型或命名空间名称 'Column'

asp.net-mvc - IIS 6上的ASP.NET MVC-通配符映射-传入请求与任何路由都不匹配

.net - 请求的性能计数器不是自定义计数器,它必须初始化为只读