Question

Je le code exemple.

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

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

Je dois traiter l'URL, processUrl charge vers le bas la page et exécuter plusieurs regex pour extraire des informations et retourner un « C # JSON comme » objet, donc je veux tourner ceci dans des parallèles et à la fin je besoin d'une liste de objets donc je dois attendre toutes les tâches à poursuivre le processus, comment puis-je y arriver? Je Sé de nombreux exemples, mais aucun enregistrement du retour.

Cordialement

Était-ce utile?

La solution

Comme cela?

var results = urls.AsParallel().Select(processUrl).ToList();

Avec Parallel:

Parallel.ForEach(
    urls, 
    url =>
    {
        var result = processUrl(url);
        lock (syncOjbect)
            objects.Add(result);
    };

ou

var objects = new ConcurrentBag<Dictionary<string,string>>();
Parallel.ForEach(urls, url => objects.Add(processUrl(url)));
var result = objects.ToList();

ou avec des tâches:

var tasks = urls
    .Select(url => Task.Factory.StartNew(() => processUrl(url)))
    .ToArray();

Task.WaitAll(tasks);
var restuls = tasks.Select(arg => arg.Result).ToList();

Autres conseils

Tout d'abord, comme refactor

processUrl(url, objects);

et rendre la tâche responsable de l'ajout des résultats à la liste.

Ensuite, ajoutez donc deux tâches de verrouillage parallèles ne pas essayer d'utiliser la liste des résultats exactement en même temps.


Note:. async soutien dans la prochaine version de .NET fera ce trivialement facile

Vous pouvez utiliser des extensions PLINQ, cela nécessite le .NET 4.0

System.Threading.Tasks.Parallel
          .ForEach(urls, url => {
             var result = processUrl(url);
             lock(objects)
             {
                  objects.Add(result);
             }
           });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top