2011-07-13 31 views
1

我有一些代碼產生一個進程,正在執行的文件是一個Java應用程序,我的意圖是從它讀取輸出。C#進程+ Backgroundworker和計時器錯誤

問題是,當我撥打Start時,我無法在該點後讀取輸出流。如果我在調用Start後測試並調用Console.Beep,則會發出嘟嘟聲 - 因此顯然正在執行這些行。

Control.CheckForIllegalCrossThreadCalls = false; 

Process java = new Process(); 
java.StartInfo.FileName = "java"; 
java.StartInfo.Arguments = "-Xms1024M -Xmx1024M -jar craftbukkit-0.0.1-SNAPSHOT.jar nogui"; 
java.StartInfo.RedirectStandardOutput = true; 
java.StartInfo.UseShellExecute = false; 
java.Start(); 

System.Console.Beep(); 
System.Console.Write("hejsan"); 
StreamReader Reader = java.StandardOutput; 

txtLog.Text = Convert.ToString(System.Console.Read()); 
broadcast(Convert.ToString(System.Console.Read()), "[Server]", false); 

爲什麼我無法從輸出流中讀取數據?

+0

請定義問題,因爲它是一個很差的問題。 –

+0

我再說一遍,在java.Start()之後它不會返回System.Console.ReadLine(),Read()或anythign! – redpois0n

+1

您需要等待流程結束才能讀取流。 –

回答

1

看看這個Microsoft參考StandardOutput

基本上,您需要撥打WaitForExit並試圖在之後讀取之後的流。這是一個阻塞調用,因此,除非你做一些時髦的東西與它不同步,這是相當直截了當:

if (java.Start()) 
{ 
    java.WaitForExit(); 
    var reader = java.StandardOutput; 
    output = reader.ReadToEnd(); 
} 

這是這裏值得一提的是,Start方法返回一個布爾值指示進程是否是實際開始 - 這有助於我們決定要做什麼,以及我們是否可以做到。

另一方面,我不禁注意到你實際上並沒有嘗試從輸出流中讀取,你只需聲明一個變量並引用它;爲了使用它,你需要調用這個類暴露的方法,比如ReadToEnd - 我已經在上面的例子中添加了用法。