Condividi tramite


Metodi System.Threading.Monitor.Wait

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Metodo Wait(Object, Int32, Boolean)

Questo metodo non restituisce fino a quando non riacquisi un blocco esclusivo sul obj parametro .

Il thread che attualmente possiede il blocco sull'oggetto specificato richiama questo metodo per rilasciare l'oggetto in modo che un altro thread possa accedervi. Il chiamante viene bloccato durante l'attesa di riacquisire il blocco. Questo metodo viene chiamato quando il chiamante deve attendere una modifica dello stato che si verificherà in seguito alle operazioni di un altro thread.

Il timeout garantisce che il thread corrente non blocchi per un periodo illimitato se un altro thread rilascia il blocco senza prima chiamare il Pulse metodo o PulseAll . Sposta anche il thread nella coda pronta, ignorando altri thread prima della coda di attesa, in modo che possa riacquisire il blocco prima. Il thread può testare il valore restituito del Wait metodo per determinare se ha riacquiso il blocco prima del timeout. Il thread può valutare le condizioni che lo hanno causato per l'immissione dell'attesa e, se necessario, chiamare di nuovo il Wait metodo.

Quando un thread chiama Wait, rilascia il blocco e immette la coda in attesa. A questo punto, il thread successivo nella coda pronta (se presente) può assumere il controllo del blocco. Il thread richiamato Wait rimane nella coda in attesa fino a quando un thread che contiene il blocco richiama PulseAllo è il successivo nella coda e un thread che contiene il blocco richiama Pulse. Tuttavia, se millisecondsTimeout è trascorso prima che un altro thread richiami il metodo o PulseAll dell'oggettoPulse, il thread originale viene spostato nella coda pronta per recuperare il blocco.

Nota

Se Infinite viene specificato per il millisecondsTimeout parametro , questo metodo si blocca per un periodo illimitato, a meno che il titolare del blocco non chiami Pulse o PulseAll. Se millisecondsTimeout è uguale a 0, il thread che chiama Wait rilascia il blocco e quindi entra immediatamente nella coda pronta per recuperare il blocco.

Il chiamante viene Wait eseguito una sola volta, indipendentemente dal numero di volte Enter richiamato per l'oggetto specificato. Concettualmente, il Wait metodo archivia il numero di volte in cui il chiamante richiamato Enter sull'oggetto e richiama Exit il numero di volte necessario per rilasciare completamente l'oggetto bloccato. Il chiamante si blocca quindi durante l'attesa di riacquisire l'oggetto. Quando il chiamante riacquisi il blocco, il sistema chiama Enter il maggior numero di volte necessario per ripristinare il conteggio salvato Enter per il chiamante. La chiamata Wait rilascia il blocco solo per l'oggetto specificato. Se il chiamante è il proprietario dei blocchi su altri oggetti, questi blocchi non vengono rilasciati.

Nota

Un oggetto sincronizzato contiene diversi riferimenti, tra cui un riferimento al thread che attualmente contiene il blocco, un riferimento alla coda pronta, che contiene i thread pronti per ottenere il blocco e un riferimento alla coda in attesa, che contiene i thread in attesa della notifica di una modifica nello stato dell'oggetto.

I Pulsemetodi , PulseAlle Wait devono essere richiamati dall'interno di un blocco di codice sincronizzato.

Le osservazioni per il Pulse metodo spiegano cosa accade se viene chiamato quando Pulse non sono in attesa thread.

Metodo Wait(Object, TimeSpan, Boolean)

Questo metodo non restituisce fino a quando non riacquisi un blocco esclusivo sul obj parametro .

Il thread che attualmente possiede il blocco sull'oggetto specificato richiama questo metodo per rilasciare l'oggetto in modo che un altro thread possa accedervi. Il chiamante viene bloccato durante l'attesa di riacquisire il blocco. Questo metodo viene chiamato quando il chiamante deve attendere una modifica dello stato che si verificherà in seguito alle operazioni di un altro thread.

Il timeout garantisce che il thread corrente non blocchi per un periodo illimitato se un altro thread rilascia il blocco senza prima chiamare il Pulse metodo o PulseAll . Sposta anche il thread nella coda pronta, ignorando altri thread prima della coda di attesa, in modo che possa riacquisire il blocco prima. Il thread può testare il valore restituito del Wait metodo per determinare se ha riacquiso il blocco prima del timeout. Il thread può valutare le condizioni che lo hanno causato per l'immissione dell'attesa e, se necessario, chiamare di nuovo il Wait metodo.

Quando un thread chiama Wait, rilascia il blocco e immette la coda in attesa. A questo punto, il thread successivo nella coda pronta (se presente) può assumere il controllo del blocco. Il thread richiamato Wait rimane nella coda in attesa fino a quando un thread che contiene il blocco richiama PulseAllo è il successivo nella coda e un thread che contiene il blocco richiama Pulse. Tuttavia, se timeout i millisecondi sono trascorsi prima che un altro thread richiami il metodo o PulseAll dell'oggettoPulse, il thread originale viene spostato nella coda pronta per recuperare il blocco.

Nota

Se per il timeout parametro viene specificato un oggetto TimeSpan che rappresenta -1 millisecondo, questo metodo si blocca a tempo indefinito, a meno che il titolare del blocco non chiami Pulse o PulseAll. Se timeout è 0 millisecondi, il thread che chiama Wait rilascia il blocco e quindi entra immediatamente nella coda pronta per recuperare il blocco.

Il chiamante viene Wait eseguito una sola volta, indipendentemente dal numero di volte Enter richiamato per l'oggetto specificato. Concettualmente, il Wait metodo archivia il numero di volte in cui il chiamante richiamato Enter sull'oggetto e richiama Exit il numero di volte necessario per rilasciare completamente l'oggetto bloccato. Il chiamante si blocca quindi durante l'attesa di riacquisire l'oggetto. Quando il chiamante riacquisi il blocco, il sistema chiama Enter il maggior numero di volte necessario per ripristinare il conteggio salvato Enter per il chiamante. La chiamata Wait rilascia il blocco solo per l'oggetto specificato. Se il chiamante è il proprietario dei blocchi su altri oggetti, questi blocchi non vengono rilasciati.

Nota

Un oggetto sincronizzato contiene diversi riferimenti, tra cui un riferimento al thread che attualmente contiene il blocco, un riferimento alla coda pronta, che contiene i thread pronti per ottenere il blocco e un riferimento alla coda in attesa, che contiene i thread in attesa della notifica di una modifica nello stato dell'oggetto.

I Pulsemetodi , PulseAlle Wait devono essere richiamati dall'interno di un blocco di codice sincronizzato.

Le osservazioni per il Pulse metodo spiegano cosa accade se viene chiamato quando Pulse non sono in attesa thread.

Uscire dal contesto

IlexitContext parametro non ha alcun effetto a meno che il Wait metodo non venga chiamato dall'interno di un contesto gestito non predefinito. Ciò può verificarsi se il thread si trova all'interno di una chiamata a un'istanza di una classe derivata da ContextBoundObject. Anche se attualmente si esegue un metodo su una classe non derivata da ContextBoundObject, ad esempio String, è possibile trovarsi in un contesto non predefinito se un ContextBoundObject oggetto si trova nello stack nel dominio applicazione corrente.

Quando il codice viene eseguito in un contesto non predefinito, specificando true per exitContext fa sì che il thread esce dal contesto gestito non predefinito ( ovvero per passare al contesto predefinito) prima di eseguire il Wait metodo . Viene restituito al contesto non predefinito originale dopo il completamento della chiamata al Wait metodo .

Ciò può essere utile quando la classe associata al contesto ha l'attributo SynchronizationAttribute applicato. In tal caso, tutte le chiamate ai membri della classe vengono sincronizzate automaticamente e il dominio di sincronizzazione è l'intero corpo del codice per la classe . Se il codice nello stack di chiamate di un membro chiama il Wait metodo e specifica true per exitContext, il thread esce dal dominio di sincronizzazione, consentendo a un thread bloccato in una chiamata a qualsiasi membro dell'oggetto di continuare. Al termine del Wait metodo, il thread che ha effettuato la chiamata deve attendere di immettere nuovamente il dominio di sincronizzazione.