Utilizzo di thread e threading

Con .NET è possibile scrivere applicazioni in grado di eseguire più operazioni contemporaneamente. Le operazioni potenzialmente in grado di compromettere altre operazioni possono essere eseguite su thread separati, un processo noto con il nome di multithreading o threading Free.

Le applicazioni che usano il multithreading sono più reattive all'input dell'utente poiché l'interfaccia utente rimane attiva mentre le attività che richiedono un uso intensivo del processore vengono eseguite su thread separati. Il multithreading è utile anche durante la creazione di applicazioni scalabili poiché consente di aggiungere thread man mano che aumenta il carico di lavoro.

Nota

Nel caso sia necessario un maggiore controllo sul comportamento dei thread dell'applicazione, è possibile gestirli personalmente. Tuttavia, la programmazione multithreading è notevolmente semplificata con le classi System.Threading.Tasks.Parallel e System.Threading.Tasks.Task, Parallel LINQ (PLINQ), le classi di raccolta simultanee nello spazio dei nomi System.Collections.Concurrent e un modello di programmazione che si basa sul concetto di attività anziché di thread. Per altre informazioni, vedere Programmazione parallela e Task Parallel Library (TPL).

Procedura: Creare e avviare un nuovo thread

Creare un nuovo thread creando una nuova istanza della classe System.Threading.Thread. Specificare il nome del metodo da eseguire nel nuovo thread fornito al costruttore. Per avviare un thread creato, chiamare il metodo Thread.Start. Per altre informazioni ed esempi, vedere l'articolo Creazione di thread e passaggio di dati all'avvio e il riferimento API Thread.

Procedura: Arrestare un thread

Per terminare l'esecuzione di un thread, usare il System.Threading.CancellationToken. Fornisce un modo unificato per arrestare i thread in modo cooperativo. Per altre informazioni, vedere Annullamento in thread gestiti.

A volte non è possibile arrestare un thread in modo cooperativo perché esegue un codice di terze parti non progettato per l'annullamento cooperativo. In questo caso, potrebbe essere necessario terminare l'esecuzione forzatamente. Per terminare l'esecuzione di un thread forzatamente, in .NET Framework è possibile usare il metodo Thread.Abort. Questo metodo genera un oggetto ThreadAbortException nel thread in cui viene richiamato. Per altre informazioni, vedere Eliminazione definitiva di thread. Il metodo Thread.Abort non è supportato in .NET Core. Se è necessario terminare l'esecuzione di un codice di terze parti forzatamente in .NET Core, è possibile eseguirlo nel processo separato e usare il metodo Process.Kill.

Il System.Threading.CancellationToken non è disponibile prima di .NET Framework 4. Per arrestare un thread nelle versioni precedenti di .NET Framework, usare le tecniche di sincronizzazione dei thread per implementare manualmente l'annullamento cooperativo. Ad esempio, è possibile creare il campo booleano volatile shouldStop e usarlo per richiedere il codice eseguito dal thread per arrestarlo. Per altre informazioni, vedere volatile in Riferimenti per C# e System.Threading.Volatile.

Usare il metodo Thread.Join per fare in modo che il thread chiamante attenda l'interruzione del thread arrestato.

Procedura: Sospendere o interrompere un thread

È possibile usare il metodo Thread.Sleep per sospendere il thread corrente per un periodo di tempo specificato. È possibile interrompere un thread bloccato chiamando il metodo Thread.Interrupt. Per altre informazioni, vedere Sospensione e interruzione di thread.

Proprietà del thread

La tabella seguente illustra alcune delle proprietà dell'oggetto Thread:

Proprietà Descrizione
IsAlive Restituisce true se il thread è stato avviato, ma non è stato ancora terminato normalmente o è stato interrotto.
IsBackground Ottiene o imposta un valore booleano che indica se un thread è un thread in background. I thread in background sono come thread in primo piano. Tuttavia, un thread in background non impedisce l'arresto di un processo. Dopo l'arresto di tutti i thread in primo piano che appartengono a un processo, Common Language Runtime termina il processo chiamando il metodo Abort nei thread in background ancora attivi. Per altre informazioni, vedere Thread in primo piano e in background.
Name Ottiene o imposta il nome del thread. Usato in genere per individuare i singoli thread durante il debug.
Priority Ottiene o imposta un valore ThreadPriority che viene usato dal sistema operativo per definire le priorità di pianificazione dei thread. Per altre informazioni, vedere Pianificazione di thread e il riferimento ThreadPriority.
ThreadState Ottiene un valore ThreadState contenente gli stati correnti di un thread.

Vedi anche