Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Il multithreading consente di aumentare la velocità di risposta dell'applicazione e, se l'applicazione viene eseguita in un sistema multiprocessore o multi-core, aumentarne la velocità effettiva.
Processi e thread
Un processo è un programma in esecuzione. Un sistema operativo usa processi per separare le applicazioni in esecuzione. Un thread è l'unità di base a cui un sistema operativo alloca il tempo del processore. Ogni thread ha una priorità di pianificazione e mantiene un set di strutture usate dal sistema per salvare il contesto del thread quando l'esecuzione del thread viene sospesa. Il contesto del thread include tutte le informazioni necessarie al thread per riprendere facilmente l'esecuzione, incluso il set di registri e stack della CPU del thread. È possibile eseguire più thread nel contesto di un processo. Tutti i thread di un processo condividono lo spazio indirizzi virtuale. Un thread può eseguire qualsiasi parte del codice del programma, incluse le parti attualmente eseguite da un altro thread.
Annotazioni
.NET Framework consente di isolare le applicazioni all'interno di un processo con l'uso di domini applicazione. I domini applicazione non sono disponibili in .NET Core. Per altre informazioni, vedere la sezione Domini applicazione e thread dell'articolo Domini applicazione .
Per impostazione predefinita, un programma .NET viene avviato con un singolo thread, spesso denominato thread primario . Tuttavia, può creare thread aggiuntivi per eseguire codice in parallelo o simultaneamente con il thread primario. Questi thread vengono spesso chiamati thread di lavoro .
Quando usare più thread
Si usano più thread per aumentare la velocità di risposta dell'applicazione e per sfruttare i vantaggi di un sistema multiprocessore o multi-core per aumentare la velocità effettiva dell'applicazione.
Si consideri un'applicazione desktop, in cui il thread primario è responsabile degli elementi dell'interfaccia utente e risponde alle azioni dell'utente. Usare i thread di lavoro per eseguire operazioni dispendiose in termini di tempo che, in caso contrario, occupano il thread primario e rendono l'interfaccia utente non reattiva. È anche possibile usare un thread dedicato per la comunicazione di rete o dispositivo per essere più reattivi ai messaggi o agli eventi in arrivo.
Se il programma esegue operazioni che possono essere eseguite in parallelo, il tempo di esecuzione totale può essere ridotto eseguendo tali operazioni in thread separati ed eseguendo il programma in un sistema multiprocessore o multi-core. In un sistema di questo tipo, l'uso del multithreading potrebbe aumentare la velocità effettiva insieme alla maggiore velocità di risposta.
Come usare il multithreading in .NET
A partire da .NET Framework 4, il modo consigliato per usare il multithreading consiste nell'usare Task Parallel Library (TPL) e Parallel LINQ (PLINQ). Per altre informazioni, vedere Programmazione parallela.
Sia TPL che PLINQ si basano sui ThreadPool thread. La System.Threading.ThreadPool classe fornisce un'applicazione .NET con un pool di thread di lavoro. È possibile utilizzare anche i thread del pool. Per altre informazioni, vedere Il thread pool gestito.
Infine, è possibile usare la System.Threading.Thread classe che rappresenta un thread gestito. Per ulteriori informazioni, consultare L'utilizzo dei thread e del threading.
Potrebbero essere necessari più thread per accedere a una risorsa condivisa. Per mantenere la risorsa in uno stato integro ed evitare la race condition, è necessario sincronizzare l'accesso dei thread ad essa. È anche possibile coordinare l'interazione di più thread. .NET offre un intervallo di tipi che è possibile usare per sincronizzare l'accesso a una risorsa condivisa o coordinare l'interazione tra thread. Per altre informazioni, vedere Panoramica delle primitive di sincronizzazione.
Gestisci le eccezioni nei thread. Le eccezioni non gestite nei thread terminano in genere il processo. Per altre informazioni, vedere Eccezioni nei thread gestiti.