我期待到创建其需要在多个线程执行的任务。 我可以即2000创建例如大量任务。 我想限制排队,并同时执行的任务数量。 有没有一种方法来创建一定数量的任务,然后创建新的,因为他们完成? 试图找出如果任务调度程序也有助于此。
编辑:
为了这句话用不同的方式...有一个原因,我应该要限制创建的任务数量/排队/执行的同时给予,我可以有一个非常大的数字如2000年是否任务调度优化调度任务,可以”不像是会发现它是如何工作的任何信息...
编辑:
我不使用Parallel.Foreach。 我已经决定使用计数器以及基于最大数量的计数器,以及任务的当前数目,创建任务或等到最大数量不超标。
如果您想发送电子邮件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有多少,这取决于你的网络连接的带宽和延迟(并且可能还您的邮件服务器)。
在回复评论质疑:
“我不知道明确有多少个核...”
你可以与核心数量Environment.ProcessorCount
并用它们来设置MaxDegreeOfParallelism
:
ParallelOptions po = new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount
};
是的,有可能经常要限制或调整由并行任务(.NET线程池)提供了新的线程默认产卵。 有很多这样的讨论:
- Parallel.ForEach不断产生新的线程
- Parallel.Foreach产卵太多的线程
- 等等