Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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 nell'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 di pronti, saltando altri thread che lo precedono nella coda di attesa, in modo che possa riacquisire il controllo del lock più rapidamente. Il thread può verificare il valore di ritorno del metodo Wait per determinare se ha riacquistato il lucchetto prima del timeout. Il thread può valutare le condizioni che lo hanno portato a entrare in attesa e, se necessario, chiamare nuovamente il metodo Wait.
Quando un thread chiama Wait, rilascia il blocco ed entra nella coda di attesa. A questo punto, il thread successivo nella coda pronta (se presente) può assumere il controllo del blocco. Il thread che ha invocato Wait rimane nella coda in attesa fino a quando un thread che detiene il blocco richiama PulseAll, o è il successivo nella coda e un thread che detiene il blocco richiama Pulse. Tuttavia, se millisecondsTimeout trascorre prima che un altro thread richiami i metodi Pulse o PulseAll dell'oggetto, il thread originale viene spostato nella coda pronta per riacquisire il blocco.
Annotazioni
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 esegue Wait una sola volta, indipendentemente dal numero di volte in cui Enter è stato 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.
Annotazioni
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 metodo Pulse spiegano cosa accade se Pulse viene chiamato quando nessun thread è in attesa.
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 nell'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 di pronti, saltando altri thread che lo precedono nella coda di attesa, in modo che possa riacquisire il controllo del lock più rapidamente. Il thread può verificare il valore di ritorno del metodo Wait per determinare se ha riacquistato il lucchetto prima del timeout. Il thread può valutare le condizioni che lo hanno portato a entrare in attesa e, se necessario, chiamare nuovamente il metodo Wait.
Quando un thread chiama Wait, rilascia il blocco ed entra nella coda di attesa. A questo punto, il thread successivo nella coda pronta (se presente) può assumere il controllo del blocco. Il thread che ha invocato Wait rimane nella coda in attesa fino a quando un thread che detiene il blocco richiama PulseAll, o è il successivo nella coda e un thread che detiene il blocco richiama Pulse. Tuttavia, se trascorrono i timeout millisecondi prima che un altro thread richiami il metodo Pulse o PulseAll di questo oggetto, il thread originale viene spostato nella coda pronta per recuperare il lock.
Annotazioni
Se per il TimeSpan parametro viene specificato un oggetto timeout che rappresenta -1 millisecondo, questo metodo viene bloccato per un periodo illimitato, 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 esegue Wait una sola volta, indipendentemente dal numero di volte in cui Enter è stato 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.
Annotazioni
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 metodo Pulse spiegano cosa accade se Pulse viene chiamato quando nessun thread è in attesa.
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, come String, è possibile trovarsi in un contesto non predefinito se un ContextBoundObject si trova nello stack del dominio applicativo 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. Quando il metodo Wait termina, il thread che ha effettuato la chiamata deve attendere di rientrare nel dominio di sincronizzazione.