2008-09-30 80 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; 

非零代碼通常是錯誤。一些應用程序使用負面的是錯誤,而正面的應用程序是狀態碼/警告。

相關問題