Alessc-MSFT ha scritto:
...omissis...
Alla fine dei conti la risposta giusta e' sempre "Dipende".
...omissis...
Alla fine dei conti, il problema fondamentale e' che il Framework non ha (ancora) una buona libreria per rendere piu' accessibile il pattern fork-join di computazioni pure con bassa memory contention. Se ci fosse (gia') qualcosa del genere nelle librerie, programmare in modo piu' parallelo sarebbe piu' popolare.
Scusate se dico la mia solo ora, ho aspettato consapevolmente che la discussione evolvesse per capire meglio le argomentazioni degli uni e degli altri.
Mi sembra che alla fine dei conti la conclusione del discorso riportata sopra sia assolutamente condivisibile. Riprendendo peraltro le argomentazioni che hanno portato alla nascita di questa discussione, provo a dare la mia interpretazione dell'articolo, dal momento che l'ho discusso con l'autore, validato e pubblicato.
Fermo restando che l'uso del ThreadPool è consigliabile in molti scenari per le argomentazioni ben esposte da Alessandro, nel caso di task long running l'utilizzo del pool può avere un effetto controproducente. Se, per esempio, un servizio (nel caso dell'articolo si parla di servizi out-of-process) risponde con tempi dell'ordine di secondi o minuti, il rientro di un thread nel pool viene parecchio ritardato, il che introduce il problema di dover garantire il funzionamento dell'applicazione anche a fronte di una serie di richieste tali da saturare il pool stesso. Parallelamente l'uso del metodo SetMaxThreads per incrementare la dimensione del pool non lo vedo come una soluzione ottimale per risolvere il problema di scalabilità in questione, perchè sposta il problema semplicemente ad un nuovo limite.
Sebbene ASP.NET stesso proponga un meccanismo built-in basato sugli handler asincroni per migliorare la scalabilità proprio per evitare la starvation derivante dalla saturazione del pool (che in molti scenari web può rappresentare la soluzione da adottare), in questo caso abbiamo optato per scrivere un articolo sul multi-threading con soluzione "custom" semplicemente per cominciare a parlare dell'argomento.
Pertanto la soluzione proposta nell'articolo esce un po' dall'optimum avendo lo scopo di introdurre l'argomento del multi-tasking, argomento spesso sconosciuto e sottovalutato dagli sviluppatori web. In fase di revisione dell'articolo non nascondo che insieme all'autore abbiamo pensato all'eventualità di usare nell'esempio il ThreadPool, ma, data la finalità dello articolo, abbiamo optato per una soluzione più "comprensibile" per non mettere troppa carne sul fuoco.
Quindi per tirare le somme, dico che la soluzione ottimale DIPENDE dal tipo di applicazione e dal tipo di task da far eseguire ai thread. Questa discussione dimostra come la scelta di una soluzione rispetto ad un'altra può avere risvolti positivi o negativi a seconda dei casi e mette in evidenza alcuni dei limiti della versione attuale del .NET Framework per lo sviluppo di applicazioni che sfruttano il pattern fork-join, che spero vengano superati con le prossime uscite tra cui il Parallel FX.
Ringrazio Alessandro per l'attenzione rivolta alla nostra community e per i preziosi feedback.
Ciao, Ricky.