我以一种非常可控的方式ProcessJobManager
将作业排入队列,一次最多可以在 X 个并发进程中处理它们。
启动每个进程后,我将它添加到 aList<ActiveProcessJob>
并将进程的 a 存储WaitHandle
在我ActiveProcessJob
的CompleteEvent
属性中,方法是构造 anew 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 );
这可以正确检测一个或多个进程(或添加到队列的项目)的终止;但是,我也在重定向标准输出流并调用Process.BeginOutputReadLine
以确保Process.OutputDataReceived
触发事件。
问题是进程终止经常被检测和处理(它active_jobs
在事件的事件处理程序最后一次触发之前从列表中删除Process.OutputDataReceived
。在这种情况下,处理程序不能引用进程,因为它已经被删除了从队列中。
我几乎需要知道一个进程何时“即将退出”,因为否则我不知道什么时候会期待最后一个OutputDataReceived
事件,这显然是在与我的WaitAny
调用不同的线程上运行的,该线程等待进程终止。
也许 Process.Exit 保证在最后一个 Process.OutputDataReceived 事件之后和 Process.HasExited 方法返回 true 之前被调用?我需要这样的确定性。