Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo Monitor.Wait (Object, Int32, Boolean)

 

Data di pubblicazione: ottobre 2016

Rilascia il blocco su un oggetto e interrompe il thread corrente finché riacquisisce il blocco. Allo scadere dell'intervallo di timeout specificato, il thread viene inserito nella coda di thread pronti. Questo metodo consente anche di specificare se il dominio di sincronizzazione per il contesto, qualora si trovi in un contesto di sincronizzazione, viene terminato prima dell'attesa e riacquisito in un secondo momento.

Spazio dei nomi:   System.Threading
Assembly:  mscorlib (in mscorlib.dll)

public static bool Wait(
	object obj,
	int millisecondsTimeout,
	bool exitContext
)

Parametri

obj
Type: System.Object

Oggetto per il quale attendere.

millisecondsTimeout
Type: System.Int32

Numero di millisecondi da attendere prima che il thread venga inserito nella coda di thread pronti.

exitContext
Type: System.Boolean

true per uscire e riacquisire il dominio di sincronizzazione per il contesto, se si trova in un contesto sincronizzato, prima dell'attesa; in caso contrario, false.

Valore restituito

Type: System.Boolean

true se il blocco è stato riacquisito prima che sia trascorso il tempo specificato; false se il blocco è stato riacquisito dopo che è trascorso il tempo specificato. Il metodo non restituisce alcun valore finché il blocco non viene riacquisito.

Exception Condition
ArgumentNullException

Il valore del parametro obj è null.

SynchronizationLockException

Wait non viene richiamato dall'interno di un blocco sincronizzato di codice.

ThreadInterruptedException

Il thread che richiama Wait viene interrotto in seguito dallo stato di attesa. Ciò si verifica quando un altro thread chiama questo thread Interrupt metodo.

ArgumentOutOfRangeException

Il valore di millisecondsTimeout parametro è negativo e non è uguale a Infinite.

Questo metodo non restituisce finché riacquisisce il blocco esclusivo sul obj parametro.

Questo metodo viene richiamato dal thread che possiede attualmente il blocco sull'oggetto specificato per il rilascio dell'oggetto in modo che un altro thread può accedervi. Il chiamante è bloccato in attesa di riacquisizione del blocco. Questo metodo viene chiamato quando il chiamante deve attendere una modifica dello stato che si verificherà in seguito a operazioni di un altro thread.

Il timeout assicura che il thread corrente non bloccarsi in modo indefinito se un altro thread rilascia il blocco senza prima chiamare il Pulse o PulseAll (metodo). Sposta inoltre il thread nella coda pronti, ignorando gli altri thread prima la coda di attesa, in modo che è possibile riacquisire il blocco di prima. Il thread può verificare il valore restituito di Wait metodo per determinare se ha riacquisito il blocco prima del timeout. Il thread può valutare le condizioni che hanno causato lo stato di attesa, e, se necessario, chiamare il Wait metodo nuovamente.

Quando un thread chiama Wait, rilascia il blocco e viene inserito nella coda di attesa. A questo punto, il thread successivo nella coda degli elementi pronti (se presente) è consentito di assumere il controllo del blocco. Il thread che ha richiamato Wait richiama un thread che contiene il blocco rimane nella coda di attesa fino a quando non PulseAll, o è in attesa nella coda e un thread che è responsabile del blocco richiama Pulse. Tuttavia, se millisecondsTimeout trascorre prima che un altro thread richiami questo oggetto Pulse o PulseAll (metodo), il thread originale viene spostato nella coda degli elementi pronti per riacquisire il blocco.

System_CAPS_noteNota

Se Infinite specificato per il millisecondsTimeout parametro, questo metodo in modo indefinito, a meno che il proprietario del blocco chiama Pulse o PulseAll. Se millisecondsTimeout è uguale a 0, il thread che chiama Wait rilascia il blocco e viene quindi immediatamente inserito nella coda pronta per riacquisire il blocco.

Il chiamante esegue Wait una volta, indipendentemente dal numero di volte in cui Enter è stato richiamato per l'oggetto specificato. Concettualmente, il Wait metodo memorizza il numero di chiamate Enter sull'oggetto e richiama Exit tutte le volte necessarie per ottenere il rilascio dell'oggetto bloccato. Il chiamante si bloccherà in attesa di riacquisizione dell'oggetto. Quando il chiamante riacquisisce il blocco, il sistema chiama Enter tutte le volte necessarie per ripristinare il salvato Enter conteggio per il chiamante. La chiamata Wait rilascia il blocco per l'oggetto specificato solo se il chiamante è il proprietario di blocchi su altri oggetti, tali blocchi non vengono rilasciati.

System_CAPS_noteNota

Un oggetto sincronizzato contiene diversi riferimenti, incluso un riferimento al thread proprietario del blocco, un riferimento alla coda pronto, che contiene i thread pronti ottenere il blocco, e un riferimento alla coda di attesa, che contiene i thread in attesa per la notifica di cambiamento dello stato dell'oggetto.

Il Pulse, PulseAll, e Wait metodi devono essere richiamati dall'interno di un blocco sincronizzato di codice.

Le note per la Pulse metodo viene descritto cosa accade se Pulse viene chiamato quando non sono in attesa alcun thread.

IlexitContext parametro ha effetto solo se il Wait metodo chiamato dall'interno di un contesto gestito. Questa situazione può verificarsi se il thread si trova all'interno di una chiamata a un'istanza di una classe derivata da ContextBoundObject. Anche se un metodo attualmente in esecuzione in una classe che non deriva da ContextBoundObject, come String, è possibile trovarsi in un contesto non predefinito se un ContextBoundObject nello stack nel dominio applicazione corrente.

Quando il codice è in esecuzione in un contesto non predefinito, specificare true per exitContext fa sì che il thread esce dal contesto gestito (vale a dire a cui passare il contesto predefinito) prima di eseguire il Wait (metodo). Restituisce il contesto non predefinito originale dopo la chiamata al Wait metodo viene completato.

Ciò può essere utile quando la classe associata al contesto dispone di SynchronizationAttribute applicato l'attributo. In tal caso, vengono sincronizzate automaticamente tutte le chiamate ai membri della classe e il dominio di sincronizzazione è l'intero corpo del codice per la classe. Se viene chiamato codice nello stack di chiamate di un membro di Wait (metodo) e specifica true per exitContext, il dominio di sincronizzazione, consentendo a un thread bloccato su una chiamata a un membro dell'oggetto di procedere si esce dal thread. Quando il Wait metodo viene restituito, il thread che ha effettuato la chiamata deve attendere di riaccedere al dominio di sincronizzazione.

.NET Framework
Disponibile da 1.1
Torna all'inizio
Mostra: