3

我有这个示例代码。

List<Dictionary<string,string>> objects = new List<Dictionary<string,string>>();

foreach (string url in urls)
{
    objects.add(processUrl(url))
}

我需要处理 URL,processUrl下载页面并运行许多正则表达式来提取一些信息并返回“C# JSON like”对象,所以我想并行运行它,最后我需要一个对象列表,所以我需要等待所有任务继续处理,我该如何完成?我有很多例子,但没有一个能保存回报。

问候

4

3 回答 3

2

像这样?

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();
于 2011-06-12T02:09:56.030 回答
0

首先,重构为

processUrl(url, objects);

并让任务负责将结果添加到列表中。

然后添加锁定,这样两个并行任务就不会尝试同时使用结果列表。


注意:async.NET 下一版本的支持将使这变得非常简单。

于 2011-06-12T02:08:21.333 回答
-1

您可以使用 Plinq 扩展,这需要 .NET 4.0

System.Threading.Tasks.Parallel
          .ForEach(urls, url => {
             var result = processUrl(url);
             lock(objects)
             {
                  objects.Add(result);
             }
           });
于 2011-06-12T02:12:40.633 回答