Ho ripetuto gli esperimenti di un CodeProject article on this topic e ho trovato i risultati per .NET 4 simili a quelli descritti nel 2003. Si noti che l'articolo non ha effettivamente elencato i risultati per la sezione problematica ma, come ho capito, il principale il problema esiste ancora.
Ho riutilizzato il codice dall'articolo CodeProject - basta scaricarlo per eseguire da solo questo test o per sperimentare.
Il test tenterà di utilizzare 10 thread paralleli per contare quanto più in alto possibile in 1 secondo.
Uso 10 thread in background (cioè new Thread()
)
T0 = 4451756
T1 = 4215159
T2 = 5449189
T3 = 6244135
T4 = 3297895
T5 = 5302370
T6 = 5256763
T7 = 3779166
T8 = 6309599
T9 = 6236041
Total = 50542073
Utilizzando elementi di lavoro 10 ThreadPool
T0 = 23335890
T1 = 20998989
T2 = 22920781
T3 = 9802624
T4 = 0
T5 = 0
T6 = 0
T7 = 0
T8 = 0
T9 = 0
Total = 77058284
notare che solo 4 filettatura elementi di lavoro piscina di 10 mai effettivamente eseguiti durante il primo intervallo di tempo! Si tratta di una CPU quad-core, quindi era un thread per core.Le altre attività eseguite dopo i primi quattro completati e poiché il 1 secondo assegnato era già scaduto, non incrementavano i loro contatori.
La conclusione qui: con attività lunghe, ThreadPool farà aspettare alcune attività dietro gli altri! Pertanto, si consiglia vivamente di non eseguire elaborazioni lunghe in attività ThreadPool (come i gestori di completamento asincroni). In caso contrario, è possibile mantenere il completamento delle chiamate asincrone più importanti se l'elaborazione dei dati esegue il hogging della CPU o si potrebbero avere prestazioni molto instabili se solo alcune attività eseguono molta elaborazione.
che utilizzano le specifiche ThreadPool personalizzato da articolo
T0 = 7175934
T1 = 6983639
T2 = 5306292
T3 = 5078502
T4 = 3279956
T5 = 8116320
T6 = 3262403
T7 = 7678457
T8 = 8946761
T9 = 8500619
Total = 64328883
io vi invito a dare un'occhiata a Rx (estensioni reattivi) che rende la programmazione asincrona una bella passeggiata serale in un parco! http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx – gideon
Alcuni utili collegamenti Rx: http://rxwiki.wikidot.com/ Ecco un piccolo codice che ho scritto per aggiornare in modo asincrono una casella di riepilogo ogni volta che digito in una casella di testo e limitarla di 0,5 secondi. Vedi-> http://stackoverflow.com/questions/4655619/simple-rx-code-silently-fails-in-windows-forms-only-during-debugging-in-visual-st – gideon