Condividi tramite


Uso di thread e gestione dei thread

Con .NET è possibile scrivere applicazioni che eseguono più operazioni contemporaneamente. Le operazioni che hanno il potenziale di rallentare altre operazioni possono essere eseguite su thread separati, un processo noto come multithreading o free threading.

Le applicazioni che usano il multithreading sono più reattive all'input dell'utente perché l'interfaccia utente rimane attiva perché le attività a elevato utilizzo del processore vengono eseguite su thread separati. Il multithreading è utile anche quando si creano applicazioni scalabili perché è possibile aggiungere thread man mano che aumenta il carico di lavoro.

Annotazioni

Se è necessario un maggiore controllo sul comportamento dei thread dell'applicazione, è possibile gestire manualmente i thread. 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 concorrenti nello spazio dei nomi System.Collections.Concurrent e un modello di programmazione basato sul concetto di attività anziché sui thread. Per altre informazioni, vedere Parallel Programming and Task Parallel Library (TPL).

Procedura: Creare e avviare un nuovo thread

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

Come fermare un thread

Per terminare l'esecuzione di un thread, usare .System.Threading.CancellationToken Fornisce una maniera unificata per arrestare i thread cooperativamente. Per altre informazioni, vedere Annullamento nei thread gestiti.

A volte non è possibile arrestare un thread in modo cooperativo perché esegue codice di terze parti non progettato per l'annullamento cooperativo. In questo caso, potrebbe essere necessario terminare l'esecuzione forzatamente. In .NET Framework è possibile usare il Thread.Abort metodo , che genera un oggetto ThreadAbortException nel thread di destinazione. Per altre informazioni, vedere Eliminazione di thread.

In .NET Core e nelle versioni successive a .NET 5, Thread.Abort genera un'eccezione PlatformNotSupportedException in fase di esecuzione. In .NET 5 e versioni successive, la chiamata genera anche un avviso di obsoletione in fase di compilazione (SYSLIB0006). Se è necessario terminare l'esecuzione di codice di terze parti forzatamente nelle implementazioni moderne di .NET, eseguirla in un processo separato e usare il Process.Kill metodo .

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 shouldStop booleano volatile 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 Thread.Join metodo per fare in modo che il thread chiamante attenda la terminazione del thread arrestato.

Procedura: Sospendere o interrompere un thread

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

Proprietà del thread

La tabella seguente presenta alcune delle Thread proprietà:

Proprietà Descrizione
IsAlive Restituisce true se un thread è stato avviato e non è stato ancora terminato normalmente o interrotto.
IsBackground Ottiene o imposta un valore Booleano che indica se un thread è in background. I thread in background sono simili ai thread in primo piano. Tuttavia, un thread in background non impedisce l'arresto di un processo. Una volta arrestati tutti i thread in primo piano che appartengono a un processo, Common Language Runtime termina il processo chiamando il Abort metodo sui thread in background ancora attivi. Per ulteriori informazioni, vedere Thread di primo piano e in background.
Name Ottiene o imposta il nome di un thread. Usato più di frequente per individuare singoli thread durante il debug.
Priority Ottiene o imposta un ThreadPriority valore utilizzato dal sistema operativo per assegnare priorità alla pianificazione dei thread. Per ulteriori informazioni, vedere Pianificazione dei thread e il riferimento ThreadPriority.
ThreadState Ottiene un ThreadState valore contenente gli stati correnti di un thread.

Vedere anche