Condividi tramite


Utilizzo del threading (Guida per programmatori C#)

Aggiornamento: novembre 2007

Per impostazione predefinita, i programmi C# comprendono un unico thread, che esegue il codice del programma iniziando e terminando con il metodo Main. Ogni comando eseguito da Main, in modo diretto o indiretto, viene eseguito dal thread predefinito, ovvero il thread primario, che termina quando viene restituito Main. È tuttavia possibile creare e utilizzare thread ausiliari per eseguire il codice in parallelo con il thread primario. Questi thread vengono definiti thread di lavoro.

I thread di lavoro possono essere utilizzati per eseguire attività lunghe o in cui il tempo riveste molta importanza, senza bloccare il thread primario. Ad esempio, vengono spesso utilizzati nelle applicazioni server per soddisfare le richieste in arrivo senza attendere il completamento della richiesta precedente. Vengono inoltre utilizzati per eseguire attività in background nelle applicazioni desktop, in modo tale che il thread principale, che gestisce gli elementi dell'interfaccia utente, garantisca tempi di risposta ottimali per le azioni dell'utente.

Il multithreading consente di risolvere i problemi legati alla velocità effettiva e alla velocità di risposta, ma può comportare problemi di condivisione delle risorse, quali i deadlock e le race condition. L'utilizzo di più thread è consigliato per le attività che richiedono risorse differenti, ad esempio handle di file e connessioni di rete. L'assegnazione di più thread a un'unica risorsa potrebbe generare errori di sincronizzazione e se i thread vengono bloccati di frequente in attesa di altri thread lo scopo del multithreading risulta vanificato.

La strategia più diffusa consiste nell'utilizzare i thread di lavoro per eseguire attività lunghe o in cui il tempo riveste importanza, ma che non richiedono molte delle risorse utilizzate da altri thread. Ovviamente alcune risorse del programma devono essere accessibili a più thread. In questi casi lo spazio dei nomi System.Threading fornisce le classi per la sincronizzazione dei thread. Tali classi comprendono Mutex, Monitor, Interlocked, AutoResetEvent e ManualResetEvent.

È possibile utilizzare alcune o tutte queste classi per sincronizzare le attività di più thread, ma il supporto per il multithreading viene fornito in parte dal linguaggio C#. L'istruzione lock di C# fornisce ad esempio funzionalità di sincronizzazione tramite l'utilizzo implicito di Monitor.

Negli argomenti seguenti vengono illustrate le tecniche di multithreading più diffuse:

Sezioni correlate

Per ulteriori informazioni, vedere:

Vedere anche

Attività

Esempio di tecnologia della sincronizzazione monitor

Esempio di tecnologia della sincronizzazione di attesa

Esempio di threading

Concetti

Guida per programmatori C#

Monitor

Operazioni interlocked

AutoResetEvent

Riferimenti

Thread

Mutex

Altre risorse

Threading gestito

Utilizzo di thread e threading

Esempi di threading