我怎么知道.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;
非零代码通常是错误。某些应用程序使用否定的表示错误,而将肯定的表示为状态码/警告。