Číst v angličtině

Sdílet prostřednictvím


Metody System.Threading.Monitor.Wait

Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.

Tato metoda se nevrátí, dokud nezíská výhradní zámek na parametru obj.

Vlákno, které aktuálně vlastní zámek u zadaného objektu, vyvolá tuto metodu, aby uvolnilo objekt, aby k němu mohlo přistupovat jiné vlákno. Volající je blokován při čekání na opětovné získání zámku. Tato metoda se volá, když volající potřebuje počkat na změnu stavu, která nastane v důsledku operací jiného vlákna.

Časový limit zajišťuje, že aktuální vlákno neblokuje neomezeně dlouho, pokud jiné vlákno uvolní zámek bez prvního volání Pulse nebo PulseAll metody. Vlákno také přesune do připravené fronty, obcházejíc tím další vlákna před ním ve frontě čekání, aby mohlo dříve znovu získat zámek. Vlákno může otestovat návratovou hodnotu metody Wait a určit, zda zámek znovu získalo před vypršením časového limitu. Vlákno může vyhodnotit podmínky, které způsobily, že vstoupilo do čekání, a v případě potřeby znovu zavolat metodu Wait.

Když vlákno zavolá Wait, uvolní zámek a přejde do čekající fronty. V tomto okamžiku může další vlákno v připravené frontě (pokud existuje) převzít kontrolu nad zámkem. Vlákno, které vyvolalo Wait , zůstává ve frontě čekání, dokud buď vlákno, které obsahuje zámek vyvolá PulseAll, nebo je to další ve frontě a vlákno, které obsahuje zámek vyvolá Pulse. Pokud však uplyne millisecondsTimeout dříve, než jiné vlákno vyvolá metodu tohoto objektu Pulse nebo PulseAll, původní vlákno se přesune do připravené fronty, aby znovu získalo zámek.

Poznámka

Je-li parametr Infinite zadán pro millisecondsTimeout, tato metoda blokuje neomezeně dlouho, pokud držitel zámku nezavolá Pulse nebo PulseAll. Pokud millisecondsTimeout se rovná 0, vlákno, které volá Wait, uvolní zámek a okamžitě vstoupí do fronty připravenosti, aby zámek znovu získalo.

Volající se spustí Wait jednou bez ohledu na počet vyvolání Enter zadaného objektu. Koncepčně metoda Wait ukládá počet, kolikrát volající vyvolal Enter na objektu, a volá Exit tolikrát, kolikrát je potřeba k úplnému uvolnění uzamčeného objektu. Volající pak zablokuje svojí činnost a čeká na opětovné získání objektu. Když volající znovu získá zámek, systém zavolá Enter tolikrát, kolikrát je nutné k obnovení uložené hodnoty Enter. Volání Wait uvolní zámek pouze pro zadaný objekt. Pokud je volající vlastníkem zámků u jiných objektů, tyto zámky se nevyvolají.

Poznámka

Synchronizovaný objekt obsahuje několik odkazů, včetně odkazu na vlákno, které aktuálně obsahuje zámek, odkaz na připravenou frontu, která obsahuje vlákna připravená k získání zámku, a odkaz na čekající frontu, která obsahuje vlákna čekající na oznámení o změně ve stavu objektu.

, PulsePulseAlla Wait metody musí být vyvolány z synchronizovaného bloku kódu.

Poznámky k metodě Pulse vysvětlují, co se stane, když se Pulse volá, když žádná vlákna nečekají.

Tato metoda se nevrátí, dokud nezíská výhradní zámek na parametru obj.

Vlákno, které aktuálně vlastní zámek u zadaného objektu, vyvolá tuto metodu, aby uvolnilo objekt, aby k němu mohlo přistupovat jiné vlákno. Volající je blokován při čekání na opětovné získání zámku. Tato metoda se volá, když volající potřebuje počkat na změnu stavu, která nastane v důsledku operací jiného vlákna.

Časový limit zajišťuje, že aktuální vlákno neblokuje neomezeně dlouho, pokud jiné vlákno uvolní zámek bez prvního volání Pulse nebo PulseAll metody. Vlákno také přesune do připravené fronty, obcházejíc tím další vlákna před ním ve frontě čekání, aby mohlo dříve znovu získat zámek. Vlákno může otestovat návratovou hodnotu metody Wait a určit, zda zámek znovu získalo před vypršením časového limitu. Vlákno může vyhodnotit podmínky, které způsobily, že vstoupilo do čekání, a v případě potřeby znovu zavolat metodu Wait.

Když vlákno zavolá Wait, uvolní zámek a přejde do čekající fronty. V tomto okamžiku může další vlákno v připravené frontě (pokud existuje) převzít kontrolu nad zámkem. Vlákno, které vyvolalo Wait , zůstává ve frontě čekání, dokud buď vlákno, které obsahuje zámek vyvolá PulseAll, nebo je to další ve frontě a vlákno, které obsahuje zámek vyvolá Pulse. Pokud uplynou milisekundy timeout předtím, než jiné vlákno vyvolá metodu Pulse nebo PulseAll tohoto objektu, původní vlákno se přesune do fronty připravenosti, aby znovu získalo zámek.

Poznámka

Pokud je pro parametr TimeSpan zadána reprezentace timeout jako -1 milisekund, tato metoda zablokuje na neurčito, pokud držitel zámku nezavolá Pulse nebo PulseAll. Pokud timeout je 0 milisekund, vlákno, které volá Wait, uvolní zámek a okamžitě vstoupí do připravené fronty připravenosti, aby znovu získalo zámek.

Volající se spustí Wait jednou bez ohledu na počet vyvolání Enter zadaného objektu. Koncepčně metoda Wait ukládá počet, kolikrát volající vyvolal Enter na objektu, a volá Exit tolikrát, kolikrát je potřeba k úplnému uvolnění uzamčeného objektu. Volající pak zablokuje svojí činnost a čeká na opětovné získání objektu. Když volající znovu získá zámek, systém zavolá Enter tolikrát, kolikrát je nutné k obnovení uložené hodnoty Enter. Volání Wait uvolní zámek pouze pro zadaný objekt. Pokud je volající vlastníkem zámků u jiných objektů, tyto zámky se nevyvolají.

Poznámka

Synchronizovaný objekt obsahuje několik odkazů, včetně odkazu na vlákno, které aktuálně obsahuje zámek, odkaz na připravenou frontu, která obsahuje vlákna připravená k získání zámku, a odkaz na čekající frontu, která obsahuje vlákna čekající na oznámení o změně ve stavu objektu.

, PulsePulseAlla Wait metody musí být vyvolány z synchronizovaného bloku kódu.

Poznámky k metodě Pulse vysvětlují, co se stane, když se Pulse volá, když žádná vlákna nečekají.

Opusťte kontext.

ParametrexitContext nemá žádný vliv, pokud Wait metoda není volána z nedefault spravovaného kontextu. K tomu může dojít, pokud se vlákno nachází ve volání instance třídy, která je odvozena z ContextBoundObject. I když aktuálně spouštíte metodu ve třídě, která není odvozena od ContextBoundObject, jako je String, můžete se nacházet mimo výchozí kontext, pokud je ContextBoundObject ve vašem zásobníku v aktuální doméně aplikace.

Když se váš kód spouští v nevýchozím kontextu, určení true pro exitContext způsobí, že vlákno opustí nevýchozí řízený kontext (to znamená přechod na výchozí kontext) před spuštěním metody Wait. Po dokončení volání Wait metody se vrátí do původního nedefaultnímu kontextu.

To může být užitečné v případě, že na kontextové třídě je aplikován atribut SynchronizationAttribute. V takovém případě jsou všechna volání členů třídy automaticky synchronizována a synchronizační doména je celý text kódu pro třídu. Pokud kód v zásobníku volání člena volá metodu Wait a specifikuje true pro exitContext, vlákno ukončí synchronizační doménu, což umožňuje vláknu, které je blokované při volání libovolného člena objektu, pokračovat. Když metoda Wait vrátí, vlákno, které provedlo volání, musí počkat na opětovné zadání synchronizační domény.


Další materiály

Dokumentace

  • Přehled primitiv synchronizace - .NET

    Informace o primitivách synchronizace vláken .NET, které se používají k synchronizaci přístupu ke sdílenému prostředku nebo interakci s řídicím vláknem