Procédé parallèle une fonction IO intensive
-
27-10-2019 - |
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
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);
}
});