2013-01-08 18 views
25

C'è qualche differenza tra i frammenti di codice seguenti. E allora?AsParallel.ForAll vs Parallel.ForEach

myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });

e

Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });

Sarà il filo conduttore di attesa per tutti i thread figlio per completare? In un'applicazione MVC, se eseguo l'elaborazione parallela nell'azione del mio controller, cosa succede ai thread secondari dopo il completamento del thread principale. Verranno abortiti o saranno completati anche dopo aver completato il thread principale?

+1

Ti suggerisco di leggere: http://reedcopsey.com/2010/02/03/parallelism-in-net-part-8-plinqs-forall-method/ – Mir

+4

Se fossi in te, vorrei aprire un'altra domanda per il tuo processo di elaborazione parallela MVC. – Pacane

+0

Si prega di prestare attenzione a AsParallel(). ForAll() in quanto causa un risultato imprevedibile. Ad esempio, ho un pulsante per eseguire questo codice quando si fa clic: myEnumerable.AsParallel(). ForAll (i as string => otherDictionary.Add (i, 0)). Aggiungerà null come chiave per altroDictionary. Ho dovuto riscrivere per utilizzare il ciclo foreach. Strano. – YukiSakura

risposta

19

Parallel.ForEach() è progettato esattamente per questo tipo di codice.

D'altra parte, ForAll() deve essere utilizzato alla fine di una query PLINQ (possibilmente complessa).

Per questo motivo, penso che lo Parallel.ForEach() sia la scelta migliore qui.

In entrambi i casi, il thread corrente verrà utilizzato per eseguire i calcoli (insieme ad alcuni thread dal pool di thread) e il metodo verrà restituito solo dopo che tutta l'elaborazione è stata completata.

+3

Perché ForAll() deve essere utilizzato alla fine di una query PLINQ? –

+2

@AranMulholland Secondo [Reed Copsey] (http://reedcopsey.com/2010/02/03/parallelism-in-net-part-8-plinqs-forall-method/) una query parallela che viene utilizzata da Parallel. Foreach() deve pagare il costo per la parallelizzazione due volte. Mentre ForAll() utilizza partizioni/thread esistenti dalla query. – Kabbalah

+1

Immagino che dal momento che 'Parallel.ForEach()' proviene dallo spazio dei nomi 'System.Threading.Tasks', allora è più probabile che sia relativo alle attività. Mentre 'AsParallel(). ForAll' proviene dal namespace' System.Linq' e quindi è più probabile che venga usato meglio con PLINQ. – Ben

-1

Hai la possibilità di ordinare gli elementi con AsParallel(). AsOrdered(). Ordinare in Parallel.ForEach non è fuori dalla scatola, abbiamo bisogno di farlo.

+0

'AsOrdered()' influenza l'ordinamento di * risultati *. E poiché 'ForAll()' non ha alcun risultato, 'AsOrdered()' non avrà alcun effetto qui. Se stai parlando di un ordine di elaborazione, questo ha senso solo per i calcoli a thread singolo. – svick

+0

Sto dicendo che usi ForAll() con AsOrdered()? Si prega di controllare. – thewpfguy

+0

Mi dispiace, mio ​​errore. Ma usando AsOrdered con Parallel.ForEach ha ancora meno senso, la raccolta originale non parallela è già ordinata, quindi aggiungendo .AsParallel(). AsOrdered() non avrà alcun effetto. Inoltre, cercare di ordinare calcoli paralleli raramente ha senso. – svick

Problemi correlati