与TPL任务的数量限制(Limit number of tasks with TPL)

2019-10-18 00:42发布

我期待到创建其需要在多个线程执行的任务。 我可以即2000创建例如大量任务。 我想限制排队,并同时执行的任务数量。 有没有一种方法来创建一定数量的任务,然后创建新的,因为他们完成? 试图找出如果任务调度程序也有助于此。

编辑:

为了这句话用不同的方式...有一个原因,我应该要限制创建的任务数量/排队/执行的同时给予,我可以有一个非常大的数字如2000年是否任务调度优化调度任务,可以”不像是会发现它是如何工作的任何信息...

编辑:

我不使用Parallel.Foreach。 我已经决定使用计数器以及基于最大数量的计数器,以及任务的当前数目,创建任务或等到最大数量不超标。

Answer 1:

如果您想发送电子邮件2000,你不希望阻止当前线程,并且您希望只使用线程的数量有限,那么我认为你应该使用一个Task调用Parallel.ForEach() 就像是:

List<Email> emails = …;

var task = Task.Factory.StartNew(() =>
{
    Parallel.ForEach(
        emails,
        new ParallelOptions { MaxDegreeOfParallelism = maxNumberOfThreads },
        email => email.Send());
});

// handle the completion of task here

如果你不知道线程的最佳数量,那么你就必须找到它了实验。 TPL能够猜测CPU绑定的计算线程的最佳数量还算不错。 但是,你的代码是不是CPU密集型的,这是网络的限制,这意味着线程的最佳数量无关,与内核的CPU有多少,这取决于你的网络连接的带宽和延迟(并且可能还您的邮件服务器)。



Answer 2:

在回复评论质疑:

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

你可以与核心数量Environment.ProcessorCount并用它们来设置MaxDegreeOfParallelism

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

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

  • Parallel.ForEach不断产生新的线程
  • Parallel.Foreach产卵太多的线程
  • 等等


文章来源: Limit number of tasks with TPL