2011-07-28 11 views
1

私が作ったプログラムは、プロセスを通して実行可能ファイルを開始するスレッドをスローします。各スレッドはプロセスを開始し、プロセスの出力を文字列(プロセスごとのinfo.additional)にリダイレクトする以下のメソッドを実行します。

私は多くの試行錯誤を経て、出力を特定の方法でリダイレクトする必要があることを知りました。

私はデュアルコアマシン上で実行しています.2つのスレッドを実行してプロセスを開始すると、プログラムは大きく実行され、これらのプロセスの出力を完全にキャプチャします。しかし、私が2つ以上のスレッド(コアを持っているスレッドより多くのスレッド)に移動すると、時々出力がキャプチャされません。どうしてこれなの?そして、誰もこれを修正する方法を知っていますか?
Processオブジェクトが行われる前に、あなたのThreadProcが出ている、ここでC#、プロセスの出力がキャプチャされないことがある(不一致)?

public void ThreadProc() 
    { 
     info.watch.Start(); 
     proc = InstantiateProcess(); 
     proc.Start(); 
     proc.BeginOutputReadLine(); 
    } 


    private void procOutputDataReceived(object sendingProcess, DataReceivedEventArgs e) 
    { 
     if (e.Data != null) 
     { 
      //Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); 
      this.info.additional += e.Data.ToString(); 
     } 
    } 
+0

を終了するまでinfo.additionalは、プロセスごとのであるかどうかは明らかではありません。そうでなければ、あなたはそれの周りにロックを置く必要があります。 –

+0

はい、申し訳ありませんが、それぞれのスレッドに対して新しいインスタンスが作成されます。 –

答えて

2

ない、これが問題を引き起こしますが、コードに基づくことができるかどうかわから、ジョー、ありがとうございました。 OutputDataReceivedドキュメントによれば、WaitForExit()を呼び出す必要があります。 "非同期出力を処理しているアプリケーションは、出力バッファがフラッシュされたことを確認するためにWaitForExit()メソッドを呼び出す必要があります。その行に基づいて、もしあなたがそれをしていなければ、あなたはいくらかのデータを失うかもしれないと思います。

ProcessオブジェクトはIDisposableを実装していますので、このようなThreadProcメソッドを変更することをお勧めします(ここではprocの宣言は表示されませんが、複数のプロセスを起動するとします)ないメンバ変数と宣言はちょうど)サンプルに取り残されました:

public void ThreadProc() 
{ 
    info.watch.Start(); 
    using (var proc = InstantiateProcess()) 
    { 
     proc.Start(); 
     proc.BeginOutputReadLine(); 
     proc.WaitForExit(); 
    } 
} 
+1

本当にありがとう!これで修正されました。私はここで敗北していた。私は次回にmsdnを読むでしょう。 –

0

あなたはProcessオブジェクトへの参照を保持しすることを確認しない限り、彼らはそれらの上に、その場合のイベントではごみ収集になります発砲を止める。

シンプルなソリューション:

  • Processオブジェクトプロセスが
関連する問題