Sospensione e ripresa di thread
Aggiornamento: novembre 2007
Le tecniche più comuni per sincronizzare le attività dei thread consistono nel blocco e nel rilascio dei thread oppure nel blocco di oggetti o aree di codice. Per ulteriori informazioni su questi meccanismi di blocco, vedere Cenni preliminari sulle primitive di sincronizzazione.
È anche possibile fare in modo che i thread vengano sospesi automaticamente. Quando i thread sono bloccati o sospesi, è possibile utilizzare un'eccezione ThreadInterruptedException per interromperne lo stato di attesa.
Metodo Thread.Sleep
Se si chiama il metodo Thread.Sleep, il thread corrente viene bloccato immediatamente per il numero di millisecondi passati a Thread.Sleep, cedendo il resto della porzione di tempo a un altro thread. Un thread non può chiamare Thread.Sleep su un altro thread.
Se si chiama Thread.Sleep con Timeout.Infinite, un thread rimarrà sospeso finché non verrà interrotto da un altro thread tramite una chiamata al metodo Thread.Interrupt o finché non verrà terminato da Thread.Abort.
Interruzione di thread
È possibile interrompere un thread in attesa chiamando il metodo Thread.Interrupt sul thread bloccato per generare un'eccezione ThreadInterruptedException, che fa uscire il thread dalla chiamata che lo blocca. Il thread dovrebbe intercettare l'eccezione ThreadInterruptedException ed eseguire le operazioni appropriate per continuare a funzionare. Se il thread ignora l'eccezione, l'ambiente di esecuzione la intercetta e interrompe il thread.
Nota: |
---|
Se il thread di destinazione non è bloccato al momento della chiamata del metodo Thread.Interrupt, il thread non subisce interruzioni finché non viene bloccato. Se il thread non si blocca, verrà completato senza subire alcuna interruzione. |
Se un'attesa è di tipo gestito, sia Thread.Interrupt che Thread.Abort riporteranno immediatamente il thread allo stato di attività. Nel caso di un'attesa non gestita, ad esempio un richiamo piattaforma alla funzione Win32 WaitForSingleObject, né Thread.Interrupt né Thread.Abort potrà assumere il controllo del thread fino alla restituzione o alla chiamata nel codice gestito. Di seguito è descritto il comportamento nel codice gestito.
Thread.Interrupt fa uscire un thread da qualsiasi attesa e genera un'eccezione ThreadInterruptedException nel thread di destinazione.
Thread.Abort è simile a Thread.Interrupt, con la differenza che il primo determina la generazione di un'eccezione ThreadAbortException sul thread. Per informazioni dettagliate, vedere Distruzione di thread.
Metodi obsoleti Suspend e Resume
Nota importante: |
---|
In .NET Framework versione 2.0, i metodi Thread.Suspend e Thread.Resume sono contrassegnati come obsoleti e verranno rimossi nelle versioni future. |
È inoltre possibile sospendere un thread chiamando il metodo Thread.Suspend. Quando un thread chiama Thread.Suspend su se stesso, la chiamata bloccherà il thread fino a quando non verrà ripreso da un altro thread. Quando un thread chiama Thread.Suspend su un altro thread, la chiamata non è bloccante e provoca la sospensione dell'altro thread. Se si chiama il metodo Thread.Resume, un altro thread uscirà dallo stato di sospensione e riprenderà l'esecuzione, indipendentemente dal numero di volte in cui Thread.Suspend è stato chiamato. Se, ad esempio, si chiama Thread.Suspend cinque volte consecutive e quindi si chiama Thread.Resume, l'esecuzione del thread verrà ripresa immediatamente dopo la chiamata a Thread.Resume.
A differenza del metodo Thread.Sleep, il metodo Thread.Suspend non determina l'interruzione immediata dell'esecuzione di un thread. Common Language Runtime deve attendere che il thread abbia raggiunto un punto sicuro prima di sospenderlo. Un thread non può essere sospeso se non è stato avviato o se è stato interrotto. Per informazioni dettagliate sui punti sicuri, vedere Thread.Suspend, operazioni di Garbage Collection e punti sicuri.
Nota importante: |
---|
I metodi Thread.Suspend e Thread.Resume generalmente non sono utili per le applicazioni e non devono essere confusi con i meccanismi di sincronizzazione. Poiché i metodi Thread.Suspend e Thread.Resume non si basano sulla cooperazione del thread che viene controllato, sono estremamente intrusivi e possono causare alle applicazioni seri problemi come i deadlock, che si verificano ad esempio se si sospende un thread che contiene una risorsa richiesta da un altro thread. |
Per alcune applicazioni è effettivamente necessario controllare la priorità dei thread per ottenere prestazioni migliori. A tale scopo, si consiglia di utilizzare la proprietà Priority anziché il metodo Thread.Suspend.
Vedere anche
Concetti
Cenni preliminari sulle primitive di sincronizzazione
Thread.Suspend, operazioni di Garbage Collection e punti sicuri