2008-09-30 79 views
5

我在写一个调度程序或排序。它基本上是一个包含exes列表(如“C:\ a.exe”)的表格和一个控制台应用程序,每分钟左右查看表格中的记录并运行尚未运行的任务。如何知道.Net System.Diagnostics.Process何时运行成功或失败?

我会像这样的任务:

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,因为有人告诉我不要。他有更多的“经验”,所以我基本上只是遵循命令。随意建议替代品。

回答

8

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

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

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

5

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

+0

有关此示例,请参阅http://msdn.microsoft.com/en-us/library/system.diagnostics.process.exitcode.aspx。 – marcj 2008-09-30 23:22:50

2

除的ExitCode,你也可以做这样的事情:

string output = p.StandardOutput.ReadToEnd(); 

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

+0

你需要小心使用这个死锁条件! http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx – hova 2008-09-30 23:31:43

0

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

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

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

相关问题