Erg, ich versuche, diese beiden Methoden mit Reflector in der BCL zu finden, kann sie aber nicht finden. Was ist der Unterschied zwischen diesen beiden Schnipsel?
EIN:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
Gibt es unterschiedliche Konsequenzen bei der Verwendung übereinander? (Angenommen, alles, was ich in den Klammern beider Beispiele mache, ist threadsicher.)
quelle
Der Unterschied ist, dass B nicht parallel ist. Das einzige, was
AsParallel()
Sie tun müssen, ist, dass es um a gewickelt wirdIEnumerable
, sodass bei Verwendung von LINQ-Methoden deren parallele Varianten verwendet werden. Der WrapperGetEnumerator()
(der hinter den Kulissen in verwendet wirdforeach
) gibt sogar das Ergebnis der ursprünglichen Sammlung zurückGetEnumerator()
.Übrigens, wenn Sie sich die Methoden in Reflector ansehen möchten,
AsParallel()
befindet sich in derSystem.Linq.ParallelEnumerable
Klasse in derSystem.Core
Assembly.Parallel.ForEach()
befindet sich in dermscorlib
Assembly (NamespaceSystem.Threading.Tasks
).quelle
.Select()
, es ruftParallelEnumerable.Select()
und nicht das normaleEnumerable.Select()
.Die zweite Methode ist nicht parallel. Die korrekte Verwendung von AsParallel () in Ihrem Beispiel wäre
quelle