Est-ce que Parallel.ForEach nécessite AsParallel ()
-
20-09-2019 - |
Question
ParallelEnumerable
a une AsParallel
membre statique. Si j'ai un IEnumerable<T>
et que vous souhaitez utiliser Parallel.ForEach
que cela implique que je serais toujours utiliserai AsParallel
?
par exemple. Est-ce que ces deux correct (tout le reste étant égales par ailleurs)?
sans AsParallel
:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
ou AsParallel
?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
La solution
Cela dépend de ce qui est appelé, ils sont des questions distinctes.
.AsParallel()
parallélise énumération pas la délégation des tâches.
Parallel.ForEach
parallélisé boucle , l'attribution des tâches aux threads de travail pour chaque élément.
Alors à moins que vos gains d'énumération source de devenir parallèle (par exemple reader.Match(file)
est cher), ils sont égaux. Pour votre dernière question, Oui , les deux sont également correctes.
En outre, il y a une autre construction, vous voudrez peut-être regarder ce qu'il raccourcit un peu, obtenir encore profiter au maximum de PLINQ:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));