外部サードパーティパッケージを実行するプロセスを開始しています。このプロセスの出力を監視するために、数秒ごとにイベントを発生させるタイマーを起動したいと考えています。ここで私は、プロセスを開始するために使用するコードは次のとおりです。プロセスを起動してイベントを監視して監視します
Process process = new Process();
process.StartInfo.FileName = exe;
process.StartInfo.Arguments = args;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.BeginErrorReadLine();
RuntimeMonitor rtm = new RuntimeMonitor(OutputFile(), InputFile(), 5000);
process.WaitForExit();
rtm.Close();
ランタイムモニタのコンストラクタは次のとおりです。
public RuntimeMonitor(string _outfile,
string _title,
double intervalMs) // in milliseconds
{
outFile = outfile;
title = _title;
timer = new System.Timers.Timer();
timer.Interval = intervalMs;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_func);
timer.AutoReset = true;
timer.SynchronizingObject = null;
timer.Start();
}
私は取得しています症状がtimer_funcは、プロセスが終了するまで呼び出されないということである(すなわち後process.WaitForExit();完了)。私はタイマ経過イベントが非同期に発生したと思ったが、ロックされているようだ。
EDIT:よく見知らぬ人になる。私はtimer.SynchronizingObjectをヌルに設定しようとしましたが、役に立たなかった。私はまた、System.Threading.Timerクラスを使ってみましたが、同じ結果を得ました。
もう1つの情報。プロセスからのデータ収集を開始するよう呼びかけますが、関連性があるかどうかはわかりません(上記のコードでBeginErrorReadLineコール)。
WaitForExitはメインスレッドを中断しますが、System.Timerはメインスレッド上でのみ実行されます。したがって、非同期で待機するか、新しいスレッドでタイマーを実行することができます。 –
WaitForExitを使用する代わりに、アプリケーションを実行したままにして、タイマーが呼び出されるたびにProcess.HasExitedブールをチェックしてください。 –
私は別のスレッドでタイマーを実行すると、行く方法だと思っています。あなたは私にそれをする方法を教えてもらえますか? –