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

时间:2018-01-22 14:42:10

标签: c# windows process

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

请注意,示例程序使用类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:\Windows\system32\Notepad.exe";


      programs.Add(new AppRunner(startInfo));
      startInfo.FileName = @"C:\Windows\system32\Calc.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 个答案:

答案 0 :(得分:0)

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