2009-05-29 75 views
0

我有一個運行外部命令行實用程序並讀取標準輸出(PNG圖像)的程序。最初在測試期間,我讓命令行程序將圖像寫入臨時文件,然後將該文件加載到程序中。我有一個Process.Exited的處理程序,如果退出代碼爲非零,則會引發異常。我在加載臨時映像之前調用WaitForExit以確保該過程已完成。如果發生異常,則在讀取臨時映像文件的代碼中處理。現在,我調用Process.Start後直接創建圖像文件,如果沒有錯誤,它可以正常工作。如果外部程序異常退出,退出處理程序拋出的異常不再被我的代碼捕獲。如果我在讀取標準輸出之前調用WaitForExit,則程序掛起。有沒有辦法在不調用WaitForExit的情況下捕獲退出處理程序拋出的異常?從Process.Exited處理程序中拋出異常

回答

0

聽起來像你的命令行實用程序沒有正確退出。你是否通過顯示流程窗口來查看它是否做了不正確的事情?

我的安全賭注是不讀標準輸出會導致程序不能退出(它等待能夠清除它的輸出),因此您必須先讀取標準輸出,然後等待實用程序停止。

+0

我知道它意外退出(Process.Exited的處理程序看到一個非零退出代碼並引發異常。)問題是我無法捕獲處理程序拋出的異常。 – pschorf 2009-05-29 15:49:30

+0

@pschorf,啊 - 我明白。你可不只是將Process.Exited處理程序中的異常存儲到變量中並使用它 - 例如在等待進程退出後拋出它? – Thies 2009-05-29 15:53:39

0

Process.Exited處理程序在與啓動進程的函數分開的上下文中執行。你可以修復這兩種方法。

  1. 開始進程後寫入循環。 (使用進程的句柄,在一個循環內調用WaitOne(100),如果你得到一個異常,那麼句柄就不存在了,你應該像進程已經完成一樣來操作,如果你沒有得到一個異常,那麼結果爲true該過程已關閉。)
  2. 在啓動過程之前創建一個Manual Reset事件,該ResetRevent事件是Reset()。啓動該進程後,請在該事件中調用WaitOne()。在Process.Exited處理程序中,設置()該事件,然後主要方法將繼續。