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控制台应用程序上运行。
答案
- 如果流程已经退出,
Process.Responding
会抛出异常。我想Responding
的目的是检查进程是否已死锁或仍在工作,但如果进程已经消失则无效。 - 在启动
Calc.exe
之后,Calculator.exe
确实立即返回(参见TaskManager)。所以你观察到的结果是正确的:你为calc.exe
开始的过程已经退出,尽管你仍然看到一个计算器窗口。
以上是关于Process.Responding检测进程退出,同时进程运行的主要内容,如果未能解决你的问题,请参考以下文章
centos 离开进程不 退出程序,检测进程fg、bg、jobs、&、nohup、ctrl+z、ctrl+c