2012-02-18 12 views
0

私はC#でWPFアプリケーションを使用していますので、システムコマンドを実行する必要があります(Qを押すのを待つため)。私は出力を初めて受け取った後に強制的に終了したいので、WPF UIをブロックしたくないので、非同期でこれをやりたい(スレッドがもっと複​​雑になると思う)。UIをブロックせずに非同期でシステムコマンドを実行し、強制的にプロセスを終了

これは私が今持っているものです。

System.Diagnostics.Process process = new System.Diagnostics.Process(); 
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
startInfo.FileName = "cmd.exe"; 
startInfo.Arguments = "/C " + command; 
process.StartInfo = startInfo; 
process.Start(); 
process.WaitForExit(); 

上記のコードは、2つの問題があります。それはブロックUIをし、それが(プロセスが終了しません)の出力を得ることはありません。

注:先に進む前に出力が必要なので、WaitForExit()を使用しました。

答えて

1
  1. BackgroundWorker Classを使用すると、別のスレッドでプロセスを実行できます。それはUIをブロックすることを防ぎます。
  2. Process.OutputDataReceived Eventを見てください。アプリケーションがリダイレクトされたStandardOutputストリームに書き込むときに発生します。したがって、プロセスが停止していなくても出力を取得できます。
+0

Processイベントを使用している場合、Process.BeginErrorReadLine()およびProcess.BeginOutputReadLine()を呼び出すとイベントが非同期で発生するため、バックグラウンドワーカーは不要です。 – Sabre

関連する問題