Il presente articolo è stato tradotto automaticamente. Passare il puntatore sulle frasi nell'articolo per visualizzare il testo originale. Ulteriori informazioni.
Traduzione
Originale
Questo argomento non è stato ancora valutato - Valuta questo argomento

Classe ThreadPool

Fornisce un pool di thread che può essere utilizzato per eseguire attività, inviare elementi di lavoro, elaborare operazioni di I/O asincrone, attendere per conto di altri thread e elaborare timer.

System.Object
  System.Threading.ThreadPool

Spazio dei nomi:  System.Threading
Assembly:  mscorlib (in mscorlib.dll)
[HostProtectionAttribute(SecurityAction.LinkDemand, Synchronization = true, 
	ExternalThreading = true)]
public static class ThreadPool

Il tipo ThreadPool espone i seguenti membri.

  NomeDescrizione
Metodo pubblicoMembro staticoBindHandle(IntPtr) Obsoleta. Consente di associare un handle del sistema operativo al ThreadPool.
Metodo pubblicoMembro staticoBindHandle(SafeHandle)Consente di associare un handle del sistema operativo al ThreadPool.
Metodo pubblicoMembro staticoGetAvailableThreadsConsente di recuperare la differenza tra il numero massimo di thread del pool di thread restituito dal metodo GetMaxThreads e il numero attualmente attivo.
Metodo pubblicoMembro staticoSupportato da XNA FrameworkGetMaxThreadsRecupera il numero di richieste al pool di thread che possono essere attive contemporaneamente. Tutte le richieste al di fuori di tale numero rimangono in coda fino a quando non diventano disponibili thread di pool di thread.
Metodo pubblicoMembro staticoGetMinThreadsRecupera il numero minimo di thread che il pool di thread crea, man mano che vengono effettuate nuove richieste, prima di passare a un algoritmo per la gestione della creazione e dell'eliminazione del thread.
Metodo pubblicoMembro staticoSupportato da XNA FrameworkSupportato da Libreria di classi portabileQueueUserWorkItem(WaitCallback)Accoda un metodo da eseguire. Il metodo viene eseguito quando un thread del pool di thread diventa disponibile.
Metodo pubblicoMembro staticoSupportato da XNA FrameworkSupportato da Libreria di classi portabileQueueUserWorkItem(WaitCallback, Object)Accoda un metodo da eseguire e specifica un oggetto che contiene i dati che dovranno essere utilizzati dal metodo. Il metodo viene eseguito quando un thread del pool di thread diventa disponibile.
Metodo pubblicoMembro staticoRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)Registra un delegato per l'attesa di WaitHandle, specificando un valore intero con segno a 32 bit per il timeout in millisecondi.
Metodo pubblicoMembro staticoRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)Registra un delegato per l'attesa di un oggetto WaitHandle, specificando un valore intero con segno a 64 bit per il timeout in millisecondi.
Metodo pubblicoMembro staticoRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)Registra un delegato per l'attesa di un WaitHandle, specificando un valore TimeSpan per il timeout.
Metodo pubblicoMembro staticoRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)Registra un delegato per l'attesa di un WaitHandle, specificando un intero senza segno a 32 bit per il timeout in millisecondi.
Metodo pubblicoMembro staticoSupportato da XNA FrameworkSetMaxThreadsImposta il numero di richieste al pool di thread che possono essere attivate contemporaneamente. Tutte le richieste al di fuori di tale numero rimangono in coda fino a quando non diventano disponibili thread di pool di thread.
Metodo pubblicoMembro staticoSetMinThreadsImposta il numero minimo di thread che il pool di thread crea, man mano che vengono effettuate nuove richieste, prima di passare a un algoritmo per la gestione della creazione e dell'eliminazione del thread.
Metodo pubblicoMembro staticoUnsafeQueueNativeOverlappedAccoda un'operazione di I/O sovrapposta per l'esecuzione.
Metodo pubblicoMembro staticoUnsafeQueueUserWorkItemAccoda il delegato specificato al pool di thread, ma non propaga lo stack di chiamata nel thread di lavoro.
Metodo pubblicoMembro staticoUnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int32, Boolean)Registra un delegato per l'attesa di un WaitHandle, specificando un intero con segno a 32 bit per il timeout in millisecondi. Questo metodo non propaga lo stack di chiamate al thread di lavoro.
Metodo pubblicoMembro staticoUnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, Int64, Boolean)Registra un delegato per l'attesa di un oggetto WaitHandle, specificando un valore intero con segno a 64 bit per il timeout in millisecondi. Questo metodo non propaga lo stack di chiamate al thread di lavoro.
Metodo pubblicoMembro staticoUnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, TimeSpan, Boolean)Registra un delegato per l'attesa di un WaitHandle, specificando un valore TimeSpan per il timeout. Questo metodo non propaga lo stack di chiamate al thread di lavoro.
Metodo pubblicoMembro staticoUnsafeRegisterWaitForSingleObject(WaitHandle, WaitOrTimerCallback, Object, UInt32, Boolean)Registra un delegato per l'attesa di un WaitHandle, specificando un intero senza segno a 32 bit per il timeout in millisecondi. Questo metodo non propaga lo stack di chiamate al thread di lavoro.
In alto

in molte applicazioni vengono creati thread il cui stato è quasi sempre sospeso, in attesa che si verifichi un evento. Altri thread potrebbero entrare in uno stato di inattività ed essere attivati solo periodicamente alla ricerca di informazioni sullo stato di una modifica o di un aggiornamento. Il pool di thread consente di utilizzare i thread in modo più efficiente fornendo all'applicazione un pool di thread di lavoro gestiti dal sistema. Esempi di operazioni che utilizzano thread del pool includono gli elementi seguenti:

  • Quando si crea un oggetto Task o Task<TResult> per eseguire in modo asincrono un'attività, per impostazione predefinita l'attività è pianificata per essere eseguita in un thread del pool di thread.

  • Timer asincroni utilizzano il pool di thread. I thread del pool di thread eseguono i callback dalla classe System.Threading.Timer e generano eventi dalla classe System.Timers.Timer.

  • Quando si utilizzano gli handle di attesa registrati, un thread di sistema monitora lo stato degli handle di attesa. Quando un'operazione di attesa viene completata, la funzione di callback corrispondente viene eseguita da un thread di lavoro contenuto nel pool di thread.

NotaNota

I thread presenti nel pool di thread gestito sono in background, ovvero le relative proprietà IsBackground sono true. Questo significa che un thread del ThreadPool non lascia applicazioni in esecuzione dopo il termine di tutti i thread in primo piano.

È possibile anche inserire nella coda elementi di lavoro non collegati ad alcuna operazione di attesa del pool di thread. Per richiedere che un elemento di lavoro venga gestito da un thread contenuto nel pool, chiamare il metodo QueueUserWorkItem. Come parametro del metodo viene utilizzato un riferimento al metodo o delegato che sarà chiamato dal thread selezionato dal pool. Una volta inserito nella coda, un elemento di lavoro non può essere annullato.

Il pool di thread viene utilizzato anche dai timer della coda dei timer e dalle operazioni di attesa registrate. Le funzioni di callback di cui dispongono sono inserite nella coda del pool di thread.

Per ogni processo è disponibile un pool di thread, A partire da .NET Framework 4, le dimensioni predefinite del pool di thread per un processo dipendono da diversi fattori, ad esempio le dimensioni dello spazio degli indirizzi virtuali. Un processo può chiamare il metodo GetMaxThreads per determinare il numero di thread. Il numero di thread nel pool di thread può essere modificato utilizzando il metodo SetMaxThreads. Ciascun thread utilizza le dimensioni dello stack predefinite e viene eseguito in base alla priorità predefinita.

NotaNota

Tramite il codice non gestito di .NET Framework è possibile modificare la dimensione del pool di thread utilizzando la funzione CorSetMaxThreads, definita nel file mscoree.h.

Il pool di thread fornisce nuovi thread di lavoro o thread di completamento di I/O su richiesta fino al raggiungimento del valore specificato per ogni categoria. Quando il minimo viene raggiunto, il pool di thread può creare thread aggiuntivi in quella categoria o può attendere che alcune attività vengano completate. A partire da .NET Framework 4, il pool di thread crea ed elimina in modo permanente i thread di lavoro, per ottimizzare la velocità effettiva, definita come numero di attività completate per unità di tempo. Un numero troppo basso di thread potrebbe non consentire un utilizzo ottimale delle risorse disponibili, mentre un numero troppo alto di thread potrebbe comportare un aumento dei conflitti di risorse.

NotaNota

Quando la richiesta è bassa, il numero effettivo di thread del pool di thread può scendere sotto i valori minimi.

È possibile utilizzare il metodo GetMinThreads per ottenere questi valori minimi.

Nota di avvisoAttenzione

È possibile utilizzare il metodo SetMinThreads per aumentare il numero minimo di thread. Se tuttavia si aumentano inutilmente questi valori, potrebbero verificarsi problemi di prestazioni. Se si avviano troppe attività contemporaneamente, potrebbero risultare tutte lente. Nella maggior parte dei casi, le prestazioni del pool di thread risultano migliori in presenza di un algoritmo per l'allocazione dei thread.

Quando il pool di thread riutilizza un thread, non cancella i dati nella memoria locale del thread o nei campi contrassegnati con l'attributo ThreadStaticAttribute. Pertanto, i dati collocati nella memoria locale del thread da un metodo possono essere esposti a qualsiasi altro metodo eseguito dallo stesso thread del pool. Un metodo che accede a un campo contrassegnato con l'attributo ThreadStaticAttribute può imbattersi in dati diversi a seconda di quale thread del pool lo esegue.

NotaNota

L'attributo HostProtectionAttribute applicato a questo tipo di membro dispone del seguente valore per la proprietà Resources: Synchronization | ExternalThreading. L'oggetto HostProtectionAttribute non influisce sulle applicazioni desktop, che in genere vengono avviate facendo doppio clic sull'icona, digitando un comando oppure immettendo un URL in un browser. Per ulteriori informazioni, vedere la classe HostProtectionAttribute o programmazione per SQL Server e attributi di protezione host.

TopicLocation
Procedura: creare un gestore HTTP asincronoGenerazione di applicazioni Web ASP.NET
Procedura: creare un gestore HTTP asincronoCompilazione di applicazioni Web ASP.NET in Visual Studio

using System;
using System.Threading;
public class Example {
    public static void Main() {
        // Queue the task.
        ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc));

        Console.WriteLine("Main thread does some work, then sleeps.");
        // If you comment out the Sleep, the main thread exits before
        // the thread pool task runs.  The thread pool uses background
        // threads, which do not keep the application running.  (This
        // is a simple example of a race condition.)
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }

    // This thread procedure performs the task.
    static void ThreadProc(Object stateInfo) {
        // No state object was passed to QueueUserWorkItem, so 
        // stateInfo is null.
        Console.WriteLine("Hello from the thread pool.");
    }
}


.NET Framework

Supportato in: 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1

Libreria di classi portabile

Supportato in: Libreria di classi portabile

Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (ruoli di base del server non supportati), Windows Server 2008 R2 (ruoli di base del server supportati con SP1 o versione successiva, Itanium non supportato)

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.

Questo tipo è thread-safe.

Il documento è risultato utile?
(1500 caratteri rimanenti)

Aggiunte alla community

AGGIUNGI
Microsoft sta conducendo un sondaggio in linea per comprendere l'opinione degli utenti in merito al sito Web di MSDN. Se si sceglie di partecipare, quando si lascia il sito Web di MSDN verrà visualizzato il sondaggio in linea.

Si desidera partecipare?
© 2013 Microsoft. Tutti i diritti riservati.