一直运行10个TPL任务的好方法。在一个循环中完成时启动一个新的?

时间:2011-12-04 07:36:57

标签: .net c#-4.0 parallel-processing task-parallel-library

我有一个Winform应用程序,我正在学习并行编程的TPL。 WinForm一直在运行&一次抓住10个网站。每个网站都由TPL任务处理。任务彼此独立。每次完成任务时,都会启动一个新任务。我打算使用Task.Factory.StartNew(..)来启动任务。

我熟悉启动TPL任务但是我没有掌握如何在循环中同时启动多个TPL任务并在每次完成时启动一个新任务,实际上有10个任务始终在运行。

我该怎么做?

3 个答案:

答案 0 :(得分:2)

如果您有一个1000个网址的列表,但是您希望同时处理不超过10个,最简单的方法是使用Parallel::ForEachParallelOptions {{3} 10个像这样:

Parallel.ForEach(myListOfUrls,
    new ParallelOptions
    {
        MaxDegreeOfParallelism = 10
    },
    url =>
    {
        // processing here
    });

答案 1 :(得分:0)

将自己的调度程序用于TaskFactory。

http://www.codeguru.com/csharp/article.php/c18931/

然后通过此调度程序基本分配10个线程。

答案 2 :(得分:0)

这实际上是动态任务并行。您的代码循环遍历您拥有的URL并在每个URL上执行正文。它还使用addMethod和并发队列将任何新URL添加到队列中。

public static void ParallelWhileNotEmpty<T>(
  IEnumerable<T> initialValues, 
  Action<T, Action<T>> body)
{
  var opts = new ParallelOptions { MaxDegreeOfParallelism = 10 };
  var from = new ConcurrentQueue<T>(initialValues);  
  while (!from.IsEmpty)
  { 
    var to = new ConcurrentQueue<T>();
    Action<T> addMethod = to.Enqueue; 
    Parallel.ForEach(from, opts. body(v, addMethod));        
    from = to;
  }
}

这样“循环”是开放式的,并将持续到你失业。显然,您的真实应用程序会考虑重复的URL并且不会添加它们等。但这允许您的应用程序动态添加工作。您可以使用ParallelOptions来限制并发,也可以编写调度程序。

有关动态任务并行性的更多信息,请参阅

http://msdn.microsoft.com/en-us/library/ff963551.aspx

有关示例的完整代码,请参阅

http://parallelpatterns.codeplex.com/SourceControl/changeset/view/54510#795590

以上两个都讨论了这个主题的其他替代变体。

如果您想要自定义调度程序来限制并行度,请参阅MSDN上的示例

http://msdn.microsoft.com/en-us/library/ee789351.aspx