我有一个 C# 程序,它将一组工作项排队。对于每个工作项,我生成另一个应用程序(我无法更改)来处理该项目。此过程是相对 CPU 密集型的。我想限制此应用程序的实例数。
我考虑过使用 PLINQ:
Parallel.ForEach(
workItems,
new ParallelOptions { MaxDegreeOfParallelism = 4 },
x => Process.Start("worker", x).WaitForExit());
但我担心的是,每个并行工作者只会用完一个线程来等待相应的进程。
我还看到 PLINQ 尝试对返回的项目进行批处理,这意味着它可能会在等待适当大小的批处理时停止。那么,也许使用单生产者/多消费者模式BlockingCollection
会起作用吗?这样做的问题是每个并行工作者都有一个线程,这会(?)比 PLINQ 解决方案更糟糕。
鉴于上述内容已简化并且我实际上TaskCompletionSource
(通过Exited
事件)连接到每个工作进程,我可以使用 TPL 中的某些东西来执行此操作而不阻塞任何后台线程吗?