Thread e threadingThreads and threading

Il multithreading consente di aumentare la velocità di risposta dell'applicazione e, se l'applicazione viene eseguita in un sistema multiprocessore o multicore, aumentare la velocità effettiva.Multithreading allows you to increase the responsiveness of your application and, if your application runs on a multiprocessor or multi-core system, increase its throughput.

Processi e threadProcesses and threads

Un processo è un programma in esecuzione.A process is an executing program. Un sistema operativo usa i processi per separare le applicazioni che vengono eseguite.An operating system uses processes to separate the applications that are being executed. Un thread è l'unità di base in cui un sistema operativo alloca il tempo del processore.A thread is the basic unit to which an operating system allocates processor time. Ogni thread ha una priorità di pianificazione e un insieme di strutture usate dal sistema per salvare il contesto del thread quando viene sospesa l'esecuzione del thread.Each thread has a scheduling priority and maintains a set of structures the system uses to save the thread context when the thread's execution is paused. Nel contesto del thread sono presenti tutte le informazioni necessarie per riprendere senza problemi l'esecuzione, incluso il set di registri della CPU del thread e lo stack.The thread context includes all the information the thread needs to seamlessly resume execution, including the thread's set of CPU registers and stack. Nel contesto di un processo possono essere eseguiti più thread.Multiple threads can run in the context of a process. Tutti i thread di un processo ne condividono lo spazio degli indirizzi virtuali.All threads of a process share its virtual address space. Un thread può eseguire qualsiasi parte del codice del programma, comprese le parti attualmente eseguite da un altro thread.A thread can execute any part of the program code, including parts currently being executed by another thread.

Nota

.NET Framework offre un modo per isolare le applicazioni all'interno di un processo con l'uso dei domini dell'applicazione.The .NET Framework provides a way to isolate applications within a process with the use of application domains. I domini applicazione non sono disponibili in .NET Core. Per altre informazioni, vedere la sezione domini applicazione e thread dell'articolo domini applicazione .(Application domains are not available on .NET Core.) For more information, see the Application domains and threads section of the Application domains article.

Per impostazione predefinita, viene avviato un programma .NET con un thread singolo, spesso chiamato thread primario.By default, a .NET program is started with a single thread, often called the primary thread. Tuttavia, è possibile creare thread aggiuntivi per eseguire il codice in parallelo o contemporaneamente al thread primario.However, it can create additional threads to execute code in parallel or concurrently with the primary thread. Questi thread sono spesso chiamati thread di lavoro.These threads are often called worker threads.

Uso di più threadWhen to use multiple threads

L'uso di più thread consente di aumentare la velocità di risposta dell'applicazione e di usare un sistema multiprocessore o multicore per aumentare la velocità effettiva dell'applicazione.You use multiple threads to increase the responsiveness of your application and to take advantage of a multiprocessor or multi-core system to increase the application's throughput.

Si consideri un'applicazione desktop in cui il thread primario è responsabile degli elementi dell'interfaccia utente e risponde alle azioni dell'utente.Consider a desktop application, in which the primary thread is responsible for user interface elements and responds to user actions. Usare i thread di lavoro per eseguire operazioni che richiedono molto tempo e che altrimenti occuperebbero il thread primario e impedirebbero all'interfaccia utente di rispondere.Use worker threads to perform time-consuming operations that, otherwise, would occupy the primary thread and make the user interface non-responsive. È anche possibile usare un thread dedicato per fare in modo che la comunicazione di rete o del dispositivo sia maggiormente reattiva ai messaggi in ingresso o agli eventi.You also can use a dedicated thread for network or device communication to be more responsive to incoming messages or events.

Se il programma esegue operazioni che possono essere eseguite in parallelo, il tempo di esecuzione totale può essere ridotto eseguendo queste operazioni in thread separati ed eseguendo il programma in un sistema multiprocessore o multicore.If your program performs operations that can be done in parallel, the total execution time can be decreased by performing those operations in separate threads and running the program on a multiprocessor or multi-core system. In un sistema di questo tipo, l'uso del multithreading potrebbe aumentare la velocità effettiva e la velocità di risposta.On such a system, use of multithreading might increase throughput along with the increased responsiveness.

Come usare il multithreading in .NETHow to use multithreading in .NET

A partire da .NET Framework 4, per il multithreading è consigliabile usare Task Parallel Library (TPL) e Parallel LINQ (PLINQ).Starting with the .NET Framework 4, the recommended way to utilize multithreading is to use Task Parallel Library (TPL) and Parallel LINQ (PLINQ). Per altre informazioni, vedere Programmazione parallela.For more information, see Parallel programming.

TPL e PLINQ sono entrambi basati su thread ThreadPool.Both TPL and PLINQ rely on the ThreadPool threads. La classe System.Threading.ThreadPool offre un'applicazione .NET con un pool di thread di lavoro.The System.Threading.ThreadPool class provides a .NET application with a pool of worker threads. È possibile usare i thread del pool di thread.You also can use thread pool threads. Per altre informazioni, vedere Pool di thread gestiti.For more information, see The managed thread pool.

Infine, è possibile usare la classe System.Threading.Thread che rappresenta un thread gestito.At last, you can use the System.Threading.Thread class that represents a managed thread. Per altre informazioni, vedere Uso di thread e threading.For more information, see Using threads and threading.

È possibile che più thread richiedano l'accesso a una risorsa condivisa.Multiple threads might need to access a shared resource. Per mantenere la risorsa in uno stato non danneggiato ed evitare race condition, è necessario sincronizzare l'accesso thread a esso.To keep the resource in a uncorrupted state and avoid race conditions, you must synchronize the thread access to it. È anche possibile coordinare l'interazione di più thread.You also might want to coordinate the interaction of multiple threads. .NET offre una gamma di tipi che è possibile usare per sincronizzare l'accesso a una risorsa condivisa o coordinare l'interazione tra thread..NET provides a range of types that you can use to synchronize access to a shared resource or coordinate thread interaction. Per altre informazioni, vedere Panoramica delle primitive di sincronizzazione.For more information, see Overview of synchronization primitives.

Gestire le eccezioni nei thread.Do handle exceptions in threads. In genere le eccezioni non gestite nei thread terminano il processo.Unhandled exceptions in threads generally terminate the process. Per altre informazioni, vedere Eccezioni in thread gestiti.For more information, see Exceptions in managed threads.

Vedere ancheSee also