2012-02-28 85 views
8

我有一個可執行文件,運行良好,當我手動運行時,它存在應有的預期輸出。但是,當我用下面的方法運行它時,Process.Exited事件永遠不會被觸發。我已經記住了Process.EnableRaisingEvents即使EnableRaisingEvents設置爲true,也不會調用Process.Exited

protected override Result Execute(RunExecutable task) 
{ 
    var process = new Process(); 
    process.StartInfo.Arguments = task.Arguments; 
    process.StartInfo.FileName = task.ExecutablePath; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.EnableRaisingEvents = true; 

    process.Exited += (sender, args) => 
    { 
     processSync.OnNext(new Result 
     { 
      Success = process.ExitCode == 0, 
      Message = process.StandardOutput.ReadToEnd() 
     }); 
     processSync.OnCompleted(); 
    }; 
    process.Start(); 

    return processSync.First();; 
} 

問題的通知是一樣的,如果我使用Process.WaitForExit(),而不是反應擴展,等待退出事件。

此外,如果我運行另一個參數,它會產生另一個輸出的過程,它存在很好。

這似乎與process.StartInfo.RedirectStandardOutput = true;有關,因爲當我禁用這個,它的作品。但那可能只是另一個問題的症狀。

任何幫助表示讚賞:-)

回答

6

你的代碼存在死鎖。 「標準輸出」只是一種命名管道,它有一個小緩衝區來將數據從一個進程傳輸到另一個進程。如果緩衝區已滿,寫入過程必須等待讀取過程從緩衝區中檢索一些數據。

因此,您開始的過程可能會等待您從標準輸出中讀取,但是您在開始讀取之前正在等待過程完成 - >死鎖。

解決方案是在流程運行時持續閱讀 - 在致電WaitForExit()之前,請致電StandardOutput.ReadToEnd()。 如果要在不阻止當前線程的情況下閱讀,可以使用BeginOutputReadLine()OutputDataReceived事件。

+0

啊,這就解釋了!謝謝 :-) – 2012-02-28 15:20:54

相關問題