Process.Responding检测进程退出,同时进程运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Process.Responding检测进程退出,同时进程运行相关的知识,希望对你有一定的参考价值。

我在检查进程是否仍在运行时遇到问题。我创建了一个小程序,应该保持2个程序的运行。在本例中,我使用记事本和Windows计算器。下面的代码将启动这两个应用程序,但它没有通过他们的process.checkalive属性检查他们的运行状态也hasexited失败。

请注意,示例程序使用类Apprunner来处理多个应用程序。启动这两个应用程序后,它崩溃了:

System.InvalidOperationException: “流程已退出,因此无法获取所请求的信息。”

尽管两个程序Notepad.exe和Calc.exe都在运行。

代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace watchdog 
{
class AppRunner
{
  public Process Program;

  public AppRunner(ProcessStartInfo processrunner)
  {
    this.Program = new Process();
        this.Program.StartInfo = processrunner;
    StartExecute();
  }
  public void StartExecute()
  {
    this.Program.Start();
  }
  public bool checkAlive()
  {
    this.Program.Refresh();
    return (bool)this.Program.Responding; 
    //fails
    // also failing as true   => return this.Program.HasExited; 
    //(its not true app still runs)
  }
  public void KeepEmRunning()
  {
    if (!checkAlive())
    {
        StartExecute();
    }
  }
}

//-----------main prog -  - - - - 
class Program
{
    static void Main(string[] args)
    {
     List<AppRunner> programs = new List<AppRunner>();

     ProcessStartInfo prog = new ProcessStartInfo();
     ProcessStartInfo startInfo = new ProcessStartInfo();
     startInfo.FileName = @"C:Windowssystem32Notepad.exe";


      programs.Add(new AppRunner(startInfo));
      startInfo.FileName = @"C:Windowssystem32Calc.exe";
      programs.Add(new AppRunner(startInfo));

      string s;
      do
        {
            System.Threading.Thread.Sleep(1000);// wait for start.
            Console.WriteLine("Notepad" + programs[0].checkAlive());
            Console.WriteLine("Calc" + programs[1].checkAlive());
            Console.WriteLine("press X for exit other key for update");
            s = Console.ReadLine().ToUpper();
        } while (s != "X");
    }
   }
 }

代码在Windows 10上运行,vs2017在.net 4.6控制台应用程序上运行。

答案
  1. 如果流程已经退出,Process.Responding会抛出异常。我想Responding的目的是检查进程是否已死锁或仍在工作,但如果进程已经消失则无效。
  2. 在启动Calc.exe之后,Calculator.exe确实立即返回(参见TaskManager)。所以你观察到的结果是正确的:你为calc.exe开始的过程已经退出,尽管你仍然看到一个计算器窗口。

以上是关于Process.Responding检测进程退出,同时进程运行的主要内容,如果未能解决你的问题,请参考以下文章

daemontools检测进程,退出拉起

检测进程替换时的退出状态

centos 离开进程不 退出程序,检测进程fg、bg、jobs、&、nohup、ctrl+z、ctrl+c

windows下批处理脚本,定时检查某一进程是不是存在,若不存在则通知用户打开此进程;若存在则退出。

Linux进程控制(精讲)

Linux进程控制