1

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

编辑:

换一种说法……我是否有理由要限制同时创建/排队/执行的任务数量,因为我可能有一个非常大的数字,例如 2000。任务调度程序是否以最佳方式调度任务,可以'似乎找不到任何关于它如何实际工作的信息......

编辑:

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

4

2 回答 2

2

如果您想发送 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 的内核数无关,它取决于网络连接的带宽和延迟(也可能您的邮件服务器)。

于 2013-04-15T18:37:01.753 回答
1

在评论中回复问题:

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

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

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

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

于 2013-04-15T10:42:10.697 回答