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