使用TPL限制任务数量

时间:2013-04-15 09:45:27

标签: .net task-parallel-library

我正在研究创建需要在多个线程上执行的任务。我可以创建大量任务,例如2000。我想限制同时排队和执行的任务数量。有没有办法创建一定数量的任务,然后在完成后创建新任务?如果任务调度程序对此有所帮助,请尝试解决。

编辑:

用不同的方式来表达这一点......我有理由想要限制同时创建/排队/执行的任务数量,因为我可以拥有一个非常大的数字,例如2000.任务调度程序是否以最佳方式安排任务,似乎无法找到有关其实际工作方式的任何信息......

编辑:

我没有使用Parallel.Foreach。我决定使用计数器,根据最大计数器数量,当前任务数量,创建任务或等到最大数量不超过。

2 个答案:

答案 0 :(得分:2)

如果你想发送2000封电子邮件,你不想阻止当前的线程而你只想使用有限数量的线程,那么我认为你应该使用一个Task来调用{{ 1}}。类似的东西:

Parallel.ForEach()

如果您不知道最佳线程数,那么您必须通过实验找到它。 TPL能够合理地猜测CPU绑定计算的最佳线程数。但是你的代码不受CPU限制,它受网络限制,这意味着最佳线程数与CPU的内核数量无关,这取决于网络连接的带宽和延迟(也可能是你的邮件服务器。)

答案 1 :(得分:1)

回复评论中的问题:

  

“我不明确知道有多少核心......”

您可以使用Environment.ProcessorCount获取核心数量并使用它们来设置MaxDegreeOfParallelism

ParallelOptions po = new ParallelOptions
{ 
    MaxDegreeOfParallelism = Environment.ProcessorCount
};  

是的,人们可能经常想要限制或调整并行任务(.NET线程池)提供的新线程的默认生成。有很多这样的讨论: