我在检查进程是否仍在运行时遇到问题。 我创建了一个小程序,应该保持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控制台应用程序上运行。
答案 0 :(得分:0)
Process.Responding
会抛出异常。我想Responding
的目的是检查流程是否已死锁或仍然有效,但如果流程已经消失,则无法正常工作。Calc.exe
确实在启动Calculator.exe
后立即返回(参见TaskManager)。因此,您观察到的结果是正确的:您为calc.exe
开始的流程已经退出,但您仍然会看到计算器窗口。