3

このサンプルコードがあります。

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

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

URLを処理しprocessUrl、ページをダウンロードし、多くの正規表現を実行して情報を抽出し、「C#JSONのような」オブジェクトを返す必要があるため、これを並行して実行したいので、最終的にオブジェクトのリストが必要になるため、すべてのタスクがプロセスを続行するのを待つには、どうすればこれを達成できますか?私は多くの例を挙げていますが、リターンを保存するものはありません。

よろしく

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);

そして、結果をリストに追加する責任をタスクに持たせます。

次に、ロックを追加して、2つの並列タスクが結果リストをまったく同時に使用しようとしないようにします。


注:async.NETの次のバージョンでのサポートにより、これは非常に簡単になります。

于 2011-06-12T02:08:21.333 に答える
-1

PLinq拡張機能を使用できます。これには.NET4.0が必要です。

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