2012-02-07 74 views
1

我目前遇到了重定向STDError和STDOutput的問題。我想要做的是,如果沒有錯誤發生,將出現打印到富文本框以及正常輸出的錯誤。重定向STD錯誤和STDOut

我遇到的問題是,如果我添加了一行重定向SDT錯誤:

string error = process1.StandardError.ReadToEnd(); 
rchsdtOut.Text = error; 

然後我的正常STD輸出不重定向到文本FILD,但如果有一個錯誤,被打印。

process1 = new System.Diagnostics.Process(); 
process1.StartInfo.UseShellExecute = false; 
process1.StartInfo.RedirectStandardOutput = true; 
process1.StartInfo.RedirectStandardError = true; 
process1.StartInfo.CreateNoWindow = true; 
process1.StartInfo.FileName = "java.exe "; 

//String abc = txtSingleBar.Text.Replace("\\", "/"); 
toLoad = lstBarToLoad.Items[i].Text; 

process1.StartInfo.Arguments = "-Xmx512M -jar"; 
process1.StartInfo.Arguments += toLoad; 

Console.WriteLine(process1.StartInfo.Arguments); 
try 
    { 
    process1.Start();  
    process1.OutputDataReceived += (s, a) => myMethod(a); 
    process1.BeginOutputReadLine(); 

    string error = process1.StandardError.ReadToEnd(); 
    rchsdtOut.Text = error; 
} 

方法將事件寫入一個文本FILD

private void myMethod(DataReceivedEventArgs e) 
{ 
    if (e.Data != null) 
    { 
     Action action =() => rchsdtOut.Text += "\r\n" + e.Data.ToString(); 
     rchsdtOut.BeginInvoke(action, null); 
     Console.WriteLine(e.Data.ToString()); 
    } 

}//end of private 

Bascally我要的是既被重定向,SDTOut和SDTError,如果發生。

任何想法?

+0

您的發佈代碼似乎有語法錯誤。請發佈可編譯的代碼。 – Oded 2012-02-07 20:46:37

+0

不確定你的意思。它符合我的要求。 – user1158745 2012-02-07 20:47:47

回答

2

爲什麼不借此:

process1.OutputDataReceived += (s, a) => myMethod(a); 
process1.BeginOutputReadLine(); 

,並補充一點:(不要忘了添加myErrorMethod!)

process1.ErrorDataReceived += (s, a) => myErrorMethod(a); 
process1.BeginErrorReadLine(); 

然後拿出這樣的:

string error = process1.StandardError.ReadToEnd(); 

而是做到這一點(如果你想等待它結束):

process1.WaitForExit(); 

基本上,你不能混合同步和異步輸出讀取。您必須使用Begin_______ReadLine()或讀取流對象,但不能同時使用。

+0

Gah。好主意。我沒有意識到有一個ErrorDataReceived方法。謝謝像魅力一樣工作。 – user1158745 2012-02-07 20:53:04