【问题标题】:How can I tell when .Net System.Diagnostics.Process ran successfully or failed?如何判断 .Net System.Diagnostics.Process 何时运行成功或失败?
【发布时间】:2010-09-14 09:47:42
【问题描述】:

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

【问题讨论】:

    标签: c# sql error-handling


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      您可以检查应用程序的ExitCode 或阅读StandardOutputStandardError 流以检查是否正在发布错误消息。

      【讨论】:

        【解决方案3】:

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

        string output = p.StandardOutput.ReadToEnd();
        

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

        【讨论】:

        【解决方案4】:

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

        【讨论】:

        猜你喜欢
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-26
        • 2014-09-28
        • 1970-01-01
        • 2012-01-24
        相关资源
        最近更新 更多