5

ProcessJobManager非常に制御された方法で、一度に最大 X 個の同時プロセスでジョブを処理するジョブをキューに入れます。

各プロセスを開始した後、それを に追加し、 を構築してそのプロパティを に割り当てることにより、プロセスの をのプロパティにList<ActiveProcessJob>保存します。WaitHandleActiveProcessJobCompleteEventnew ManualResetEvent( false )SafeWaitHandlenew 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 を返す前に呼び出されることが保証されているのでしょうか? みたいな確実性が必要です。

4

1 に答える 1