我有一个Winform应用程序,我正在学习并行编程的TPL。 WinForm一直在运行&一次抓住10个网站。每个网站都由TPL任务处理。任务彼此独立。每次完成任务时,都会启动一个新任务。我打算使用Task.Factory.StartNew(..)来启动任务。
我熟悉启动TPL任务但是我没有掌握如何在循环中同时启动多个TPL任务并在每次完成时启动一个新任务,实际上有10个任务始终在运行。
我该怎么做?
答案 0 :(得分:2)
如果您有一个1000个网址的列表,但是您希望同时处理不超过10个,最简单的方法是使用Parallel::ForEach
和ParallelOptions
{{3} 10个像这样:
Parallel.ForEach(myListOfUrls,
new ParallelOptions
{
MaxDegreeOfParallelism = 10
},
url =>
{
// processing here
});
答案 1 :(得分:0)
答案 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上的示例