2010-02-16 15 views
18

ParallelEnumerable ha un membro statico AsParallel. Se ho un IEnumerable<T> e voglio usare Parallel.ForEach vuol dire che dovrei sempre usare AsParallel?Parallel.ForEach richiede AsParallel()

ad es. Sono entrambi corretti (a parità di condizioni)?

senza AsParallel:

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f)); 

o con AsParallel?

List<string> list = new List<string>(); 
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f)); 

risposta

21

Dipende da ciò che viene chiamato, sono problemi separati.

.AsParallel() Parallelizza l'enumerazione non la delega di attività.

Parallel.ForEach Parallelizzato il ciclo , assegnando attività ai thread di lavoro per ciascun elemento.

Quindi, a meno che l'enumerazione della sorgente non diventi parallela (ad esempio reader.Match(file) è costosa), sono uguali. Alla tua ultima domanda, , entrambi sono anche corretti.

Inoltre, c'è un altro costrutto si consiglia di guardare in che accorcia un po ', ancora ottenere il massimo beneficio di PLINQ:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f)); 
+2

Hmmm ... Che cosa è esattamente parrallelizing l'enumerazione? o almeno come si può separare questa paralleizzazione dalla delegazione del compito? – dkackman

+2

@dkackman '.AsParallel()' legge la numerazione per l'esecuzione parallela, in particolare la versione parallela di '.SelectMany()' in questo caso. Pensa a un'enumerazione che ha una pesante clausola 'Where' ma senza un ordine, potremmo valutare quella clausola where simultaneamente su quanti più core possibile dando il successivo nell'enumerazione al successivo thread disponibile, rendendolo quasi' n' volte più veloce. Quello che facciamo con quel risultato può anche essere gestito allo stesso modo in seguito, sia in modo sincrono in un thread o diffuso tra i core come disponibile, che è la parte 'Parallel.ForEach' o' .ForAll', ha senso? –

+0

Questo ha senso. Grazie Nick. – dkackman

Problemi correlati