Pool di thread gestitiThe managed thread pool

La classe System.Threading.ThreadPool fornisce all'applicazione un pool di thread di lavoro gestiti dal sistema, per consentire di concentrarsi sulle attività dell'applicazione anziché sulla gestione dei thread.The System.Threading.ThreadPool class provides your application with a pool of worker threads that are managed by the system, allowing you to concentrate on application tasks rather than thread management. Se si dispone di attività brevi che richiedono l'elaborazione in background, il pool di thread gestiti consente di sfruttare in modo semplice i vantaggi di più thread.If you have short tasks that require background processing, the managed thread pool is an easy way to take advantage of multiple threads. L'uso del pool di thread è molto più semplice in Framework 4 e versioni successive, perché è possibile creare oggetti Task e Task<TResult> che eseguono attività asincrone nei thread del pool.Use of the thread pool is significantly easier in Framework 4 and later, since you can create Task and Task<TResult> objects that perform asynchronous tasks on thread pool threads.

.NET usa i thread del pool per numerosi scopi, tra cui operazioni Task Parallel Library (TPL), completamento I/O asincrono, callback timer, operazioni di attesa registrate, chiamate asincrone di metodi tramite delegati e connessioni socket System.Net..NET uses thread pool threads for many purposes, including Task Parallel Library (TPL) operations, asynchronous I/O completion, timer callbacks, registered wait operations, asynchronous method calls using delegates, and System.Net socket connections.

Caratteristiche del pool di threadThread pool characteristics

I thread del pool sono thread in background.Thread pool threads are background threads. Ogni thread usa la dimensione dello stack predefinita, viene eseguito con la priorità predefinita e si trova in un apartment a thread multipli.Each thread uses the default stack size, runs at the default priority, and is in the multithreaded apartment. Dopo il completamento dell'attività, il thread del pool torna in una coda di thread in attesa.Once a thread in the thread pool completes its task, it's returned to a queue of waiting threads. Da questo momento il thread può essere riusato,From this moment it can be reused. evitando in questo modo la necessità di creare un nuovo thread per ogni attività.This reuse enables applications to avoid the cost of creating a new thread for each task.

È presente un solo pool di thread per processo.There is only one thread pool per process.

Eccezioni nei thread del poolExceptions in thread pool threads

Le eccezioni non gestite nei thread del pool terminano il processo.Unhandled exceptions in thread pool threads terminate the process. Vi sono tre eccezioni a questa regola:There are three exceptions to this rule:

Per altre informazioni, vedere Eccezioni in thread gestiti.For more information, see Exceptions in Managed Threads.

Numero massimo di thread del poolMaximum number of thread pool threads

Il numero di operazioni che possono essere accodate al pool di thread è limitato solo dalla memoria disponibile.The number of operations that can be queued to the thread pool is limited only by available memory. Tuttavia il pool di thread limita il numero di thread che possono essere attivi contemporaneamente nel processo.However, the thread pool limits the number of threads that can be active in the process simultaneously. Se tutti i thread del pool sono occupati, gli elementi di lavoro aggiuntivi vengono accodati fino a quando non tornano disponibili thread per l'esecuzione degli elementi stessi.If all thread pool threads are busy, additional work items are queued until threads to execute them become available. A partire da .NET Framework 4 la dimensione predefinita del pool di thread per un processo dipende da diversi fattori, ad esempio la dimensione dello spazio degli indirizzi virtuali.Beginning with the .NET Framework 4, the default size of the thread pool for a process depends on several factors, such as the size of the virtual address space. Un processo può chiamare il metodo ThreadPool.GetMaxThreads per determinare il numero di thread.A process can call the ThreadPool.GetMaxThreads method to determine the number of threads.

È possibile controllare il numero massimo di thread usando i metodi ThreadPool.GetMaxThreads e ThreadPool.SetMaxThreads.You can control the maximum number of threads by using the ThreadPool.GetMaxThreads and ThreadPool.SetMaxThreads methods.

Nota

Il codice che ospita Common Language Runtime può impostare la dimensione tramite il metodo ICorThreadpool::CorSetMaxThreads.Code that hosts the common language runtime can set the size using the ICorThreadpool::CorSetMaxThreads method.

Valori minimi del pool di threadThread pool minimums

Il pool di thread fornisce nuovi thread di lavoro o thread di completamento di I/O su richiesta fino a raggiungere un valore minimo specificato per ogni categoria.The thread pool provides new worker threads or I/O completion threads on demand until it reaches a specified minimum for each category. È possibile usare il metodo ThreadPool.GetMinThreads per ottenere questi valori minimi.You can use the ThreadPool.GetMinThreads method to obtain these minimum values.

Nota

Quando la richiesta è bassa, il numero effettivo di thread del pool può scendere sotto i valori minimi.When demand is low, the actual number of thread pool threads can fall below the minimum values.

Quando viene raggiunto un valore minimo, il pool di thread può creare thread aggiuntivi o attendere il completamento di alcune attività.When a minimum is reached, the thread pool can create additional threads or wait until some tasks complete. A partire da .NET Framework 4 il pool di thread crea ed elimina thread di lavoro per ottimizzare la velocità effettiva, definita come numero di attività completate per unità di tempo.Beginning with the .NET Framework 4, the thread pool creates and destroys worker threads in order to optimize throughput, which is defined as the number of tasks that complete per unit of time. Un numero troppo ridotto di thread potrebbe non usare in modo ottimale le risorse disponibili, mentre troppi thread potrebbero aumentare il conflitto per le risorse.Too few threads might not make optimal use of available resources, whereas too many threads could increase resource contention.

Attenzione

È possibile usare il metodo ThreadPool.SetMinThreads per aumentare il numero minimo di thread inattivi.You can use the ThreadPool.SetMinThreads method to increase the minimum number of idle threads. Tuttavia, un aumento non necessario di questi valori può provocare problemi di prestazioni.However, unnecessarily increasing these values can cause performance problems. Se si avviano troppe attività contemporaneamente, potrebbero sembrare tutte lente.If too many tasks start at the same time, all of them might appear to be slow. Nella maggior parte dei casi, il pool di thread offre prestazioni migliori con il proprio algoritmo per l'allocazione dei thread.In most cases the thread pool will perform better with its own algorithm for allocating threads.

Uso del pool di threadUsing the thread pool

A partire da .NET Framework 4 il modo più semplice per usare il pool di thread consiste nell'uso di Task Parallel Library (TPL).Beginning with the .NET Framework 4, the easiest way to use the thread pool is to use the Task Parallel Library (TPL). Per impostazione predefinita i tipi TPL come Task e Task<TResult> usano i thread del pool per eseguire le attività.By default, TPL types like Task and Task<TResult> use thread pool threads to run tasks.

È anche possibile usare il pool di thread chiamando ThreadPool.QueueUserWorkItem dal codice gestito (o ICorThreadpool::CorQueueUserWorkItem dal codice non gestito) e passando un delegato System.Threading.WaitCallback che rappresenta il metodo che esegue l'attività.You can also use the thread pool by calling ThreadPool.QueueUserWorkItem from managed code (or ICorThreadpool::CorQueueUserWorkItem from unmanaged code) and passing a System.Threading.WaitCallback delegate representing the method that performs the task.

Un altro metodo per usare il pool di thread consiste nell'accodare gli elementi di lavoro correlati a un'operazione di attesa usando il metodo ThreadPool.RegisterWaitForSingleObject e passando un oggetto System.Threading.WaitHandle che, quando viene segnalato o in caso di time out, chiama il metodo rappresentato dal delegato System.Threading.WaitOrTimerCallback.Another way to use the thread pool is to queue work items that are related to a wait operation by using the ThreadPool.RegisterWaitForSingleObject method and passing a System.Threading.WaitHandle that, when signaled or when timed out, calls the method represented by the System.Threading.WaitOrTimerCallback delegate. I thread del pool vengono usati per richiamare i metodi di callback.Thread pool threads are used to invoke callback methods.

Per esempi, vedere le pagine delle API di riferimento.For the examples, check the referenced API pages.

Ignorare i controlli di sicurezzaSkipping security checks

Il pool di thread fornisce anche i metodi ThreadPool.UnsafeQueueUserWorkItem e ThreadPool.UnsafeRegisterWaitForSingleObject.The thread pool also provides the ThreadPool.UnsafeQueueUserWorkItem and ThreadPool.UnsafeRegisterWaitForSingleObject methods. Usare questi metodi solo quando si è certi che lo stack del chiamante non sia rilevante per i controlli di sicurezza svolti durante l'esecuzione dell'attività in coda.Use these methods only when you are certain that the caller's stack is irrelevant to any security checks performed during the execution of the queued task. I metodi ThreadPool.QueueUserWorkItem e ThreadPool.RegisterWaitForSingleObject consentono entrambi di acquisire lo stack del chiamante, che viene unito nello stack del thread del pool quando il thread inizia a eseguire un'attività.ThreadPool.QueueUserWorkItem and ThreadPool.RegisterWaitForSingleObject both capture the caller's stack, which is merged into the stack of the thread pool thread when the thread begins to execute a task. Se è necessario un controllo di sicurezza, deve essere controllato l'intero stack.If a security check is required, the entire stack must be checked. Sebbene il controllo garantisca la sicurezza, comporta anche una riduzione delle prestazioni.Although the check provides safety, it also has a performance cost.

Quando non usare i thread del poolWhen not to use thread pool threads

Vi sono diversi scenari in cui è opportuno creare e gestire i propri thread anziché usare i thread del pool, come nei casi seguenti:There are several scenarios in which it's appropriate to create and manage your own threads instead of using thread pool threads:

  • È necessario un thread in primo piano.You require a foreground thread.
  • È necessario che un thread abbia una priorità specifica.You require a thread to have a particular priority.
  • Sono presenti attività che causano il blocco del thread per lunghi periodi di tempo.You have tasks that cause the thread to block for long periods of time. Il pool di thread prevede un numero massimo di thread, pertanto un numero elevato di thread del pool bloccati potrebbe impedire l'avvio delle attività.The thread pool has a maximum number of threads, so a large number of blocked thread pool threads might prevent tasks from starting.
  • È necessario inserire thread di un apartment a thread singolo.You need to place threads into a single-threaded apartment. Tutti i thread di ThreadPool sono inclusi in apartment a thread multipli.All ThreadPool threads are in the multithreaded apartment.
  • È necessario disporre di un'identità stabile associata al thread o dedicare un thread a un'attività.You need to have a stable identity associated with the thread, or to dedicate a thread to a task.

Vedere ancheSee also