问题描述
我有这个示例代码。
List<Dictionary<string,string>> objects = new List<Dictionary<string,string>>();
foreach (string url in urls)
{
objects.add(processUrl(url))
}
我需要处理URL,“ѭ1”下载页面并运行许多正则表达式以提取一些信息并返回\“ C#JSON like \”对象,因此我想并行运行它,最后我需要一个对象列表所以我需要等待所有任务才能继续进行操作,我该如何完成呢?我举了很多例子,但没有一个保存回报。
问候
解决方法
像这样?
var results = urls.AsParallel().Select(processUrl).ToList();
与Parallel
:
Parallel.ForEach(
urls,url =>
{
var result = processUrl(url);
lock (syncOjbect)
objects.Add(result);
};
要么
var objects = new ConcurrentBag<Dictionary<string,string>>();
Parallel.ForEach(urls,url => objects.Add(processUrl(url)));
var result = objects.ToList();
或带有任务:
var tasks = urls
.Select(url => Task.Factory.StartNew(() => processUrl(url)))
.ToArray();
Task.WaitAll(tasks);
var restuls = tasks.Select(arg => arg.Result).ToList();
, 首先,将其重构为
processUrl(url,objects);
并使该任务负责将结果添加到列表中。
然后添加锁定,这样两个并行任务就不会尝试同时使用结果列表。
注意:.NET的下一版本中的“ 8”支持将使此操作变得简单。
, 您可以使用PLinq扩展名,这需要.NET 4.0
System.Threading.Tasks.Parallel
.ForEach(urls,url => {
var result = processUrl(url);
lock(objects)
{
objects.Add(result);
}
});