ProcessJobManager
非常に制御された方法で、一度に最大 X 個の同時プロセスでジョブを処理するジョブをキューに入れます。
各プロセスを開始した後、それを に追加し、 を構築してそのプロパティを に割り当てることにより、プロセスの をのプロパティにList<ActiveProcessJob>
保存します。WaitHandle
ActiveProcessJob
CompleteEvent
new ManualResetEvent( false )
SafeWaitHandle
new SafeWaitHandle( my_process.Handle, false )
次のようなコードを使用して、プロセスが終了するのを待ちます (および「new_jobs_queued」も):
WaitHandle[] wait_handles =
active_jobs
.Select<ActiveProcessJob,WaitHandle>( j => j.CompleteEvent )
.Union( new WaitHandle[]{ new_jobs_queued} ).ToArray();
WaitHandle.WaitAny( wait_handles );
これにより、1 つ以上のプロセス (またはキューに追加されたアイテム) の終了が適切に検出されます。ただし、標準出力ストリームをリダイレクトし、イベントがProcess.BeginOutputReadLine
確実に発生するように呼び出しも行っています。Process.OutputDataReceived
問題は、プロセスの終了が頻繁に検出され、処理されることです (active_jobs
イベントのイベント ハンドラーが最後に起動する前にリストから削除されProcess.OutputDataReceived
ます。その場合、プロセスは既に削除されているため、ハンドラーは Process を参照できません)。キューから。
プロセスがいつ「終了しようとしているか」を知る必要があります。そうしないと、プロセスが終了するのを待つ呼び出しとOutputDataReceived
は明らかに別のスレッドで実行される最後のイベントがいつ発生するかがわからないためです。WaitAny
おそらく、Process.Exit は、最後の Process.OutputDataReceived イベントの後、Process.HasExited メソッドが true を返す前に呼び出されることが保証されているのでしょうか? みたいな確実性が必要です。