Ho esaminato la praticità di alcune delle nuove funzionalità parallele in .Net 4.0.Funzionalità parallele in .Net 4.0
Dire che ho il codice in questo modo:
foreach (var item in myEnumerable)
myDatabase.Insert(item.ConvertToDatabase());
Immaginate myDatabase.Insert sta eseguendo alcuni lavori di inserire in un database SQL.
Teoricamente si potrebbe scrivere:
Parallel.ForEach(myEnumerable, item => myDatabase.Insert(item.ConvertToDatabase()));
E automaticamente si ottiene il codice che sfrutta più core.
Ma cosa succede se myEnumerable può essere interagito solo con un singolo thread? La classe Parallel sarà enumerata da un singolo thread e invierà il risultato solo ai thread worker nel loop?
E se myDatabase può essere interagito solo con un singolo thread? Non sarebbe certamente meglio creare una connessione al database per iterazione del ciclo.
Infine, cosa succede se il mio "oggetto var" sembra essere un UserControl o qualcosa che deve essere interagito con il thread dell'interfaccia utente?
Quale modello di progettazione dovrei seguire per risolvere questi problemi?
Mi sembra che passare a Parallel/PLinq/etc non sia esattamente facile quando si ha a che fare con applicazioni reali.
La migliore risposta finora, comunque una domanda a parte: dì che il mio loop-body esegue un'operazione IO a lunga esecuzione (richiesta di rete, database, ecc.), La classe Parallel rileva i thread sospesi/sospesi e ne avvia automaticamente una nuova? O sarà limitato al numero di core sulla macchina? – jonathanpeppers
@ Jonathan.Peppers: l'utilità di pianificazione delle operazioni di default gestisce questo piuttosto bene. Inietterà del lavoro extra nella situazione. (Per impostazione predefinita, il ThreadPool utilizza molti più elementi rispetto ai thread e ridimensiona in base al carico di lavoro in modo dinamico) –