2011-07-13 8 views
1

私はプロセスを生成するいくつかのコードを持っています。実行されているファイルはJavaアプリケーションであり、私の意図はそこから出力を読み込むことです。C#Process + Backgroundworker&timer error

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

マイクロソフトのStandardOutputを参照してください。

基本的にWaitForExitに電話し、の後にストリームを読み取ろうとする必要があります。それはStart方法は、プロセスが実際にしたかどうかを示すブール値を返すことをここで言及する価値があります

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

:それはあなたがそれと非同期でいくつかのファンキーなものを行う場合を除きので、これはかなり簡単です、ブロッキング呼び出しです開始 - これは私たちが何をすべきか、そしてそれができるかどうかを決めるのに役立ちます。

もう1つ注意しておきたいのは、実際にはではないことに気づくことはできません。を参照して出力ストリームから読み込むには、変数を参照して宣言するだけです。それを利用するには、クラスによって公開されているメソッド(例えばReadToEnd)を呼び出す必要があります。上の例で使用方法を追加しました。