BackgroundWorker è la stessa cosa di un thread di thread. Lo aggiunge la possibilità di eseguire eventi sul thread dell'interfaccia utente. Molto utile per mostrare i progressi e per aggiornare l'interfaccia utente con il risultato. Quindi il suo uso tipico è quello di impedire che l'interfaccia utente si congeli quando è necessario lavorare. Le prestazioni non sono il primo obiettivo, l'esecuzione del codice in modo asincrono è. Questo modello è anche abilmente esteso nelle versioni .NET successive dalla classe Task <> e dalle parole chiave async/await.
I thread del pool di thread sono utili per evitare di consumare risorse. Un thread è un costoso oggetto del sistema operativo ed è possibile creare un numero molto limitato di essi. Un thread accetta 5 handle di sistema operativo e un megabyte di spazio di indirizzi di memoria virtuale. Nessun metodo Dispose() per rilasciare queste maniglie in anticipo. Il pool di thread esiste principalmente per riutilizzare i thread e assicurarsi che non siano attivi troppi thread. È importante utilizzare un thread pool di thread solo quando il lavoro è limitato, idealmente non impiegando più di mezzo secondo. E non bloccare spesso. È quindi più adatto per brevi raffiche di lavoro, non per le situazioni in cui le prestazioni sono importanti. La gestione del completamento I/O è un compito ideale per un thread TP.
Sì, è possibile utilizzare anche i thread per migliorare le prestazioni di un programma. Lo farebbe utilizzando Thread o un'attività <> che utilizza TaskContinuationOptions.LongRunning. Ci sono alcuni requisiti difficili da ottenere in realtà un miglioramento delle prestazioni, sono piuttosto rigide:
- È necessario più di un thread. In un caso ideale, due thread possono dimezzare il tempo necessario per ottenere un lavoro. E meno, più fili usi. Avvicinarsi a quell'ideale è tuttavia difficile, non scala in modo infinito. Google "legge di Amdahl" per informazioni.
- È necessaria una macchina con un processore con più core. Facile da ottenere in questi giorni. Il numero di thread creati non deve superare il numero di core disponibili. L'utilizzo di più sarà di solito inferiore prestazioni.
- È necessario il tipo di lavoro con limiti di elaborazione, in cui il motore di esecuzione del processore è la risorsa vincolata. Questo è abbastanza comune, ma certamente non slamdunk. Molti lavori sono effettivamente limitati dal throughput I/O, come la lettura da un file o una query di dbase. Oppure sono limitati dalla velocità con cui il processore può leggere i dati dalla RAM. Tali lavori non traggono vantaggio dai thread, avrete a disposizione più motori di esecuzione ma avrete ancora un solo disco e un bus di memoria.
- È necessario un algoritmo in grado di distribuire il lavoro su più thread senza quasi alcuna necessità di sincronizzazione. Di solito questo è il problema difficile da risolvere, molti algoritmi sono di natura molto sequenziale e non sono facilmente parallelizzabili.
- Avrai bisogno di tempo e pazienza per rendere il codice stabile e performante. La scrittura del codice filettato è rigido e una corsa al thread che causa l'arresto anomalo del programma una volta al mese o produce un risultato non valido occasionalmente può rappresentare un notevole spreco di tempo.
fonte
2013-06-09 13:16:46
Dipende da come non usarli. – I4V