2012-10-13 80 views
2

我只想將流程的標準輸出重定向到一個文件。聽起來很簡單,但是我什麼都試過不行:RedirectStandardOutput防止引發Process.Exited事件?

  1. 把一個DOS風格的重定向中的參數(例如param1 param2 > output.txt)不工作列表;

  2. 使用RedirectStandardOutput = true工作,但是,顯然過程不會引發事件時,它存在。所以通過process.Exited += ...定義的處理程序不會執行。要清楚,一旦我刪除了RedirectStandardOutput = true聲明,它就會引發一個事件。

我在做什麼錯?

+0

什麼異常有退出的過程呢?你是否依靠拋出的異常來知道何時停止該過程? – ekolis

+0

一旦啓用'RedirectStandardXXX',您就負責抽取該源,否則該過程會「暫停」,因爲緩衝區已滿。你認爲所有的輸出都去哪了?它走向你;你必須閱讀它! –

回答

1

方法#2必須走的路。
這個問題似乎是由輸出緩衝造成的,它阻止了觸發事件的觸發Exited

您應該考慮消除Exited事件處理程序。相反,訂閱OutputDataReceived事件並在處理程序檢查Process.HasExited財產進行清理作業:

process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 

... 

void process_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Process p = (Process) sender; 
    if(p.HasExited) ... 
} 
+0

輸出緩衝不會阻止'Exited'被觸發,您沒有抽取標準輸出的事實會使進程「暫停」,因爲它無法再寫入輸出。一旦你開始閱讀標準輸出,一切正常。你可以做;您不必在退出事件中「放棄」! –