Erg, j'essaie de trouver ces deux méthodes dans le BCL en utilisant Reflector, mais je ne peux pas les localiser. Quelle est la différence entre ces deux extraits?
UNE:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
Y a-t-il des conséquences différentes de l'utilisation de l'un par rapport à l'autre? (Supposons que tout ce que je fais dans les corps entre crochets des deux exemples est thread-safe.)
la source
La différence est que B n'est pas parallèle. La seule chose à
AsParallel()
faire est qu'il s'enroule autour de aIEnumerable
, de sorte que lorsque vous utilisez des méthodes LINQ, leurs variantes parallèles sont utilisées. Le wrapperGetEnumerator()
(qui est utilisé dans les coulisses duforeach
) renvoie même le résultat de la collection d'origineGetEnumerator()
.BTW, si vous souhaitez examiner les méthodes de Reflector,
AsParallel()
est dans laSystem.Linq.ParallelEnumerable
classe de l'System.Core
assembly.Parallel.ForEach()
se trouve dans l'mscorlib
assembly (espace de nomsSystem.Threading.Tasks
).la source
.Select()
, il appelleParallelEnumerable.Select()
et non la normaleEnumerable.Select()
.La deuxième méthode ne sera pas parallèle, la manière correcte d'utiliser AsParallel () dans votre exemple serait
la source