我正在研究创建需要在多个线程上执行的任务。我可以创建大量任务,例如2000。我想限制同时排队和执行的任务数量。有没有办法创建一定数量的任务,然后在完成后创建新任务?如果任务调度程序对此有所帮助,请尝试解决。
编辑:
用不同的方式来表达这一点......我有理由想要限制同时创建/排队/执行的任务数量,因为我可以拥有一个非常大的数字,例如2000.任务调度程序是否以最佳方式安排任务,似乎无法找到有关其实际工作方式的任何信息......
编辑:
我没有使用Parallel.Foreach。我决定使用计数器,根据最大计数器数量,当前任务数量,创建任务或等到最大数量不超过。
答案 0 :(得分:2)
如果你想发送2000封电子邮件,你不想阻止当前的线程而你只想使用有限数量的线程,那么我认为你应该使用一个Task
来调用{{ 1}}。类似的东西:
Parallel.ForEach()
如果您不知道最佳线程数,那么您必须通过实验找到它。 TPL能够合理地猜测CPU绑定计算的最佳线程数。但是你的代码不受CPU限制,它受网络限制,这意味着最佳线程数与CPU的内核数量无关,这取决于网络连接的带宽和延迟(也可能是你的邮件服务器。)
答案 1 :(得分:1)
回复评论中的问题:
“我不明确知道有多少核心......”
您可以使用Environment.ProcessorCount
获取核心数量并使用它们来设置MaxDegreeOfParallelism
:
ParallelOptions po = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
是的,人们可能经常想要限制或调整并行任务(.NET线程池)提供的新线程的默认生成。有很多这样的讨论: