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.

Wait(Object, Int32, Boolean) Metoda

Tato metoda nevrací, dokud nevyvolá výhradní zámek 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 zablokovaný při čekání na opětovné vyvolá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. Také přesune vlákno do připravené fronty a obejití dalších vláken před ní ve frontě čekání, aby bylo možné zámek znovu získat dříve. Vlákno může otestovat návratovou Wait hodnotu metody a určit, zda se zámek znovu vynutil před vypršením časového limitu. Vlákno může vyhodnotit podmínky, které způsobila zadání čekání, a v případě potřeby znovu zavolat metodu Wait .

Při volání Waitvlákna 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. millisecondsTimeout Pokud však uplynou před jiným vláknem vyvolá objekt nebo PulseAll metodu tohoto objektuPulse, původní vlákno se přesune do připravené fronty, aby znovu získal zámek.

Poznámka:

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

Volající se spustí Wait jednou bez ohledu na počet vyvolání Enter zadaného objektu. Koncepčně Wait metoda ukládá počet volání vyvolá na Enter objekt a volá Exit tolikrát, kolikrát je potřeba k úplnému uvolnění uzamčeného objektu. Volající pak zablokuje čekání na opětovné vyvolání objektu. Když volající znovu zavolá zámek, systém zavolá Enter tolikrát, kolikrát je potřeba k obnovení uloženého Enter počtu volajícího. 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 pro metodu Pulse vysvětlují, co se stane, když Pulse se volá, když žádné vlákna čekají.

Wait(Object, TimeSpan, Boolean) Metoda

Tato metoda nevrací, dokud nevyvolá výhradní zámek 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 zablokovaný při čekání na opětovné vyvolá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. Také přesune vlákno do připravené fronty a obejití dalších vláken před ní ve frontě čekání, aby bylo možné zámek znovu získat dříve. Vlákno může otestovat návratovou Wait hodnotu metody a určit, zda se zámek znovu vynutil před vypršením časového limitu. Vlákno může vyhodnotit podmínky, které způsobila zadání čekání, a v případě potřeby znovu zavolat metodu Wait .

Při volání Waitvlákna 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 timeout však milisekundy uplynuly před jiným vláknem vyvolá tento objekt nebo PulseAll metodu tohoto objektuPulse, původní vlákno se přesune do připravené fronty, aby znovu získal zámek.

Poznámka:

TimeSpan Pokud je pro timeout parametr zadán parametr představující -1 milisekund, tato metoda zablokuje neomezeně dlouhou dobu, pokud držitel volání zámku Pulse nebo PulseAll. Pokud timeout je 0 milisekund, vlákno, které volá Wait zámek, uvolní zámek a okamžitě přejde do připravené fronty, aby znovu získal zámek.

Volající se spustí Wait jednou bez ohledu na počet vyvolání Enter zadaného objektu. Koncepčně Wait metoda ukládá počet volání vyvolá na Enter objekt a volá Exit tolikrát, kolikrát je potřeba k úplnému uvolnění uzamčeného objektu. Volající pak zablokuje čekání na opětovné vyvolání objektu. Když volající znovu zavolá zámek, systém zavolá Enter tolikrát, kolikrát je potřeba k obnovení uloženého Enter počtu volajícího. 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 pro metodu Pulse vysvětlují, co se stane, když Pulse se volá, když žádné vlákna čekají.

Ukončete kontext.

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

Když se váš kód spouští v nedefaultním kontextu, určuje true , že exitContext vlákno ukončí nedefaultní spravovaný kontext (to znamená přechod na výchozí kontext) před spuštěním Wait metody. 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 kontextová třída má SynchronizationAttribute použitý atribut. 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í člen volá metodu Wait a určuje true pro exitContext, vlákno ukončí synchronizační doménu, což umožňuje vlákno blokované 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.