我怎么知道.Net System.Diagnostics.Process是何时成功运行或者失败?

时间:2020-03-06 14:57:13  来源:igfitidea点击:

我正在编写调度程序或者排序程序。它基本上是一个包含exe列表的表(例如" C:\ a.exe")和一个控制台应用程序,该应用程序每分钟左右查看表中的记录并运行尚未运行的任务。

我运行这样的任务:

System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = someExe; // like "a.exe"
p.Start();

我如何知道某个特定任务是否失败?例如,如果a.exe抛出未处理的异常怎么办?我希望上面的代码知道何时发生这种情况,并使用"特定任务失败"等内容更新任务表。

我怎样才能做到这一点?

我没有使用Sql Agent或者Windows Scheduler,因为其他人告诉我不要这样做。他有更多的"经验",所以我基本上只是按照命令去做。随时建议替代方案。

解决方案

我认为我们正在寻找Process.ExitCode,假设该进程返回1.
但是,我们可能需要使用WaitForExit()。还有一个ErrorDataReceived事件,当应用程序发送到stderr时会触发该事件。

除了ExitCode,我们还可以执行以下操作:

string output = p.StandardOutput.ReadToEnd();

这将捕获本应写入命令窗口的所有内容。然后,可以根据应用程序解析该字符串以获取已知模式以显示错误。

我们可以捕获Win32Exception来检查Process.Start()是否由于文件不存在而失败或者执行访问被拒绝。

但是,我们无法捕获使用此类创建的进程引发的异常。首先,该应用程序可能不会用.NET编写,因此可能根本没有例外的概念。

我们可以做的是检查应用程序的ExitCode或者读取StandardOutput和StandardError流,以检查是否已发布错误消息。

扩展@jop所说的内容。我们还需要等待该过程关闭。因此:

p.Start();
        p.WaitForExit();
        int returnCode = p.ExitCode;

非零代码通常是错误。某些应用程序使用否定的表示错误,而将肯定的表示为状态码/警告。