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

bq3bfh9z  于 2022-11-26  发布在  .NET
关注(0)|答案(2)|浏览(222)

如果另一个进程没有响应,是否有可能从代码中检查?
问题是即使应用程序崩溃并且在管理器的列表上标记为“不响应”,Process.Responding属性仍然返回“true”。
“Exited”事件和函数“WaitForExit”会在进程退出时执行任何操作。所以这不是重点。
问题就在两个字;我需要知道应用程序崩溃了。如何从代码中检查它?
感谢您抽出宝贵时间。

oyt4ldly

oyt4ldly1#

    • 此问题没有通用的解决方案。**

无法判断特定进程是否挂起,因为术语"挂起"完全取决于正在执行的进程的上下文。
挂起进程将始终执行其编码所要执行的操作。开发人员可能将其编码得很糟糕,但Windows无法对什么是对的/什么是错的做出假设。
可以尝试的想法可能是:

  1. Process.Responding调用将指示正在执行windows消息循环的进程是否正在响应。
    1.对于更一般的情况,一个可能的解决方案是每隔一段时间轮询一次进程的内存使用情况,如果在足够长的时间后内存使用情况没有变化,就认为它挂起了。我预计这将导致大量误报-未处理任何内容的稳定进程可能会出现挂起。它还将导致假阴性,即具有内存泄漏的挂起进程看起来正在做一些有用的事情,而实际上它被困在循环中。
    1.如果进程写入StandardError/StandardOutput流(许多控制台应用程序都是这样做的),则可以尝试侦听这样的输出:Process.BeginOutputReadLineProcess.BeginErrorReadLine。如果在给定时间段内没有这样的输出,则可以推断它已挂起。
    但是你不会找到任何在一般情况下有效的方法。
h5qlskok

h5qlskok2#

有一个解决方案可以用于某些用例,如果你的进程是一个fire -〉process -〉exit类型的进程,那么你所要做的就是监视CPU周期。
当然,它的缺点是不能立即检测到挂起的进程,如果你的进程是基于事件的,并且在一段时间内处于空闲状态,它就不起作用。

TimeSpan processorTime;
public async Task<bool> MonitorProcess(Process activeProcess, int timeoutSeconds = 30) {
    int hungCycles = 0;
    while (!activeProcess.HasExited)
    {
        await Task.Delay(1000);
        if (activeProcess.TotalProcessorTime == processorTime)
            hungCycles++;
        else
        {
            processorTime = activeProcess.TotalProcessorTime;
            hungCycles = 0;
        }
        if (hungCycles > timeoutSeconds)
            return false;
    }
    return true;
}

相关问题