2013-07-10 6 views
6

C#では、完了までに2〜3時間かかるサードパーティアプリケーションを開始しています。リアルタイムでコンソールに書き込むためにプロセスの出力が必要です。私はマイクロソフトのウェブサイトからBeginOutputReadLine()RedirectStandardOutputの研究を行ったが、私のコードはまだ動作していない。C#プロセスの出力をリアルタイムで表示します。

現在のところ、私のコードはプロセスが終了したときの出力のみを表示しています。私はどこが間違っているのか分からない。

static void Main(string[] args) 
{ 
    Process process; 
    process = new Process(); 
    process.StartInfo.FileName = "C:\\ffmbc\\ffmbc.exe"; 
    process.StartInfo.Arguments = "-i \\\\dssp-isi-t\\TMD\\B002C010_130520_R2R7.2398v5.mxf -an -vcodec libx264 -level 4.1 -preset veryslow -tune film -x264opts bluray-compat=1:weightp=0:bframes=3:nal-hrd=vbr:vbv-maxrate=40000:vbv-bufsize=30000:keyint=24:b-pyramid=strict:slices=4:aud=1:colorprim=bt709:transfer=bt709:colormatrix=bt709:sar=1/1:ref=4 -b 30M -bt 30M -threads 0 -pass 1 -y \\\\dss-isi-t\\MTPO_Transfer\\dbay\\B002C010_130520_R2R7.2398v5.mxf.h264"; 
    process.StartInfo.UseShellExecute = false; 
    process.StartInfo.CreateNoWindow = true; 
    process.StartInfo.RedirectStandardOutput = true; 
    process.OutputDataReceived += new DataReceivedEventHandler(OutputHandler); 
    process.StartInfo.RedirectStandardInput = true; 
    process.Start(); 
    process.BeginOutputReadLine(); 
    process.WaitForExit(); 
    process.Close(); 
} 

private static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine) 
{ 
    string line; 
    line = (outLine.Data.ToString()); 
    Console.WriteLine(line); 
} 
+0

@Xeano全く同じ質問ではありませんが、はい、かなり似ています。 – feralin

+1

これはかなり正常です。出力をリダイレクトすると、プロセスはバッファリングされた出力に切り替わります。それがたくさんのテキストを吐き出さないならば、そのバッファはそれをフラッシュさせるのに十分ではありません。プログラムのコードを修正できない場合は、何もできません。 –

答えて

6

ライン

process.WaitForExit(); 

は、与えられたプロセスが終了するまで待つように、現在のプログラムが発生します。これはあなたが望むものではありません。おそらくプロセスを開始し、非同期に実行させてから、完了したらそれを知らせたいと思うでしょう。そのためには、process.Exitedイベントを使用します。

+0

私はprocess.WaitForExit()を削除します。コンソールがバックグラウンドでプロセスを実行して閉じても、リアルタイム出力は表示されません。私は 'OutputHandler'メソッドから文字列を許可しましたか? – user2475310

2

前回の質問と同様に、私は答えました、おそらく重複しています。 参照:次に

process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardOutput = true; 
process.OutputDataReceived += p_OutputDataReceived; 
process.Start(); 
process.BeginOutputReadLine(); 

、データを受信するためのイベントハンドラ:Pipe a stream to Debug.Write()

はここにいるから私の答え(わずかに修正)です。

void p_OutputDataReceived(object sender, DataReceivedEventArgs e) 
{ 
    Console.Write(e.Data); 
} 

基本的には、プロセスが完了するまでプログラムがハングアップするので、WaitForExit()を省略する必要があります。

+1

前の質問は何ですか?リンクを提供する。そして、これが単にその答えの逆戻りであるならば、あなたの応答は答えではなく、コメントでなければなりません。 –

+0

アドバイス@JimMischelをありがとう、私は私の答えにリンクを追加します。申し訳ありませんが私の答えが適切でない場合は、私はしばしば答えにフラグを立てるときといつそれらに答えるかについて混乱しています。 – Gray