如何判断 .Net System.Diagnostics.Process 何时成功运行或失败

本文关键字:何时 Process 成功 运行 失败 Diagnostics System 何判断 判断 Net | 更新日期: 2023-09-27 17:47:22

我正在编写调度程序或排序。 它基本上是一个包含 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 代理或 Windows Scheduler,因为其他人告诉我不要这样做。 他有更多的"经验",所以我基本上只是服从命令。 随意提出替代方案。

如何判断 .Net System.Diagnostics.Process 何时成功运行或失败

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

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

您可以做的是检查应用程序的 ExitCode 或读取 StandardOutput 和 StandardError 流以检查是否正在发布错误消息。

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

除了 ExitCode 之外,您还可以执行以下操作:

string output = p.StandardOutput.ReadToEnd();

这将捕获将写入命令窗口的所有内容。 然后,您可以分析该字符串以获取用于显示错误的已知模式,具体取决于应用。

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

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

非零代码通常是错误。一些应用程序使用负数是错误,而正数是状态代码/警告。