Metody System.Threading.Monitor.Wait
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Wait(Object, Int32, Boolean) Metoda
Ta metoda nie zwraca się, dopóki nie odzyska blokady na wyłączność parametru obj
.
Wątek, który obecnie jest właścicielem blokady określonego obiektu, wywołuje tę metodę w celu zwolnienia obiektu, aby inny wątek mógł uzyskać do niego dostęp. Obiekt wywołujący jest zablokowany podczas oczekiwania na ponowne odzyskanie blokady. Ta metoda jest wywoływana, gdy obiekt wywołujący musi poczekać na zmianę stanu, która wystąpi w wyniku operacji innego wątku.
Limit czasu gwarantuje, że bieżący wątek nie blokuje się na czas nieokreślony, jeśli inny wątek zwalnia blokadę bez uprzedniego Pulse wywołania metody or PulseAll . Przenosi również wątek do gotowej kolejki, pomijając inne wątki przed nim w kolejce oczekiwania, aby można było szybciej odzyskać blokadę. Wątek może przetestować wartość Wait zwracaną metody, aby określić, czy ponownie zwróciła blokadę przed przekroczeniem limitu czasu. Wątek może ocenić warunki, które spowodowały wprowadzenie oczekiwania, i w razie potrzeby wywołać metodę Wait ponownie.
Gdy wątek wywołuje Wait
element , zwalnia blokadę i przechodzi do kolejki oczekującej. W tym momencie następny wątek w gotowej kolejce (jeśli istnieje) może przejąć kontrolę nad blokadą. Wątek wywoływany Wait
pozostaje w kolejce oczekiwania do momentu, aż wątek, który przechowuje blokadę wywołuje PulseAll, lub jest następny w kolejce i wątek, który przechowuje blokadę wywołuje Pulse. millisecondsTimeout
Jeśli jednak upłynie, zanim inny wątek wywoła ten obiekt Pulse lub PulseAll metodę, oryginalny wątek zostanie przeniesiony do gotowej kolejki w celu odzyskania blokady.
Uwaga
Jeśli Infinite parametr jest określony millisecondsTimeout
, ta metoda blokuje się na czas nieokreślony, chyba że posiadacz wywołań Pulse blokady lub PulseAll. Jeśli millisecondsTimeout
równa się 0, wątek wywołujący Wait
zwalnia blokadę, a następnie natychmiast przechodzi do gotowej kolejki w celu odzyskania blokady.
Obiekt wywołujący Wait
wykonuje raz, niezależnie od liczby wywołań Enter dla określonego obiektu. Koncepcyjnie Wait
metoda przechowuje liczbę wywołań wywoływanych Enter w obiekcie i wywołuje Exit tyle razy, ile razy jest to konieczne, aby w pełni zwolnić zablokowany obiekt. Obiekt wywołujący następnie blokuje się podczas oczekiwania na ponowne pobieranie obiektu. Gdy obiekt wywołujący ponownie odwołuje blokadę, system wywołuje Enter tyle razy, ile razy jest to konieczne, aby przywrócić zapisaną Enter liczbę dla obiektu wywołującego. Wywołanie Wait
zwalnia blokadę tylko dla określonego obiektu; jeśli obiekt wywołujący jest właścicielem blokad w innych obiektach, te blokady nie są zwalniane.
Uwaga
Zsynchronizowany obiekt zawiera kilka odwołań, w tym odwołanie do wątku, który obecnie przechowuje blokadę, odwołanie do kolejki gotowej, która zawiera wątki, które są gotowe do uzyskania blokady, oraz odwołanie do kolejki oczekującej, która zawiera wątki oczekujące na powiadomienie o zmianie stanu obiektu.
PulseMetody , PulseAlli Wait
muszą być wywoływane z zsynchronizowanego bloku kodu.
Uwagi dotyczące Pulse metody wyjaśniają, co się stanie, jeśli Pulse jest wywoływana, gdy nie ma oczekujących wątków.
Wait(Object, TimeSpan, Boolean) Metoda
Ta metoda nie zwraca się, dopóki nie odzyska blokady na wyłączność parametru obj
.
Wątek, który obecnie jest właścicielem blokady określonego obiektu, wywołuje tę metodę w celu zwolnienia obiektu, aby inny wątek mógł uzyskać do niego dostęp. Obiekt wywołujący jest zablokowany podczas oczekiwania na ponowne odzyskanie blokady. Ta metoda jest wywoływana, gdy obiekt wywołujący musi poczekać na zmianę stanu, która wystąpi w wyniku operacji innego wątku.
Limit czasu gwarantuje, że bieżący wątek nie blokuje się na czas nieokreślony, jeśli inny wątek zwalnia blokadę bez uprzedniego Pulse wywołania metody or PulseAll . Przenosi również wątek do gotowej kolejki, pomijając inne wątki przed nim w kolejce oczekiwania, aby można było szybciej odzyskać blokadę. Wątek może przetestować wartość Wait zwracaną metody, aby określić, czy ponownie zwróciła blokadę przed przekroczeniem limitu czasu. Wątek może ocenić warunki, które spowodowały wprowadzenie oczekiwania, i w razie potrzeby wywołać metodę Wait ponownie.
Gdy wątek wywołuje Wait
element , zwalnia blokadę i przechodzi do kolejki oczekującej. W tym momencie następny wątek w gotowej kolejce (jeśli istnieje) może przejąć kontrolę nad blokadą. Wątek wywoływany Wait
pozostaje w kolejce oczekiwania do momentu, aż wątek, który przechowuje blokadę wywołuje PulseAll, lub jest następny w kolejce i wątek, który przechowuje blokadę wywołuje Pulse. Jeśli timeout
jednak milisekundy upłyną przed wywołaniem metody lub PulseAll obiektu Pulse przez inny wątek, oryginalny wątek zostanie przeniesiony do kolejki gotowej w celu odzyskania blokady.
Uwaga
Jeśli dla parametru timeout
określono wartość reprezentującą TimeSpan -1 milisekundę, ta metoda blokuje się na czas nieokreślony, chyba że posiadacz wywołań Pulse blokady lub PulseAll. Jeśli timeout
wartość to 0 milisekund, wątek wywołujący Wait
zwalnia blokadę, a następnie natychmiast przechodzi do gotowej kolejki w celu odzyskania blokady.
Obiekt wywołujący Wait
wykonuje raz, niezależnie od liczby wywołań Enter dla określonego obiektu. Koncepcyjnie Wait
metoda przechowuje liczbę wywołań wywoływanych Enter w obiekcie i wywołuje Exit tyle razy, ile razy jest to konieczne, aby w pełni zwolnić zablokowany obiekt. Obiekt wywołujący następnie blokuje się podczas oczekiwania na ponowne pobieranie obiektu. Gdy obiekt wywołujący ponownie odwołuje blokadę, system wywołuje Enter tyle razy, ile razy jest to konieczne, aby przywrócić zapisaną Enter liczbę dla obiektu wywołującego. Wywołanie Wait
zwalnia blokadę tylko dla określonego obiektu; jeśli obiekt wywołujący jest właścicielem blokad w innych obiektach, te blokady nie są zwalniane.
Uwaga
Zsynchronizowany obiekt zawiera kilka odwołań, w tym odwołanie do wątku, który obecnie przechowuje blokadę, odwołanie do kolejki gotowej, która zawiera wątki, które są gotowe do uzyskania blokady, oraz odwołanie do kolejki oczekującej, która zawiera wątki oczekujące na powiadomienie o zmianie stanu obiektu.
PulseMetody , PulseAlli Wait
muszą być wywoływane z zsynchronizowanego bloku kodu.
Uwagi dotyczące Pulse metody wyjaśniają, co się stanie, jeśli Pulse jest wywoływana, gdy nie ma oczekujących wątków.
Kończ kontekst
ParametrexitContext
nie ma wpływu, chyba że Wait metoda jest wywoływana z wewnątrz kontekstu zarządzanego bez definicji. Może się tak zdarzyć, jeśli wątek znajduje się wewnątrz wywołania wystąpienia klasy pochodzącej z ContextBoundObjectklasy . Nawet jeśli obecnie wykonujesz metodę w klasie, która nie pochodzi z ContextBoundObjectklasy , na przykład String, możesz znajdować się w kontekście niedefinicyjnym, jeśli ContextBoundObject element znajduje się na stosie w bieżącej domenie aplikacji.
Gdy kod jest wykonywany w kontekście niezdefinicyjnym, określając true
exitContext
, że wątek ma zamknąć kontekst zarządzany bez definicji (tj. przejść do kontekstu domyślnego) przed wykonaniem Wait metody. Po zakończeniu wywołania metody zostanie zwrócony do oryginalnego kontekstu niezdefinicyjnego Wait .
Może to być przydatne, gdy klasa powiązana z kontekstem SynchronizationAttribute ma zastosowany atrybut. W takim przypadku wszystkie wywołania elementów członkowskich klasy są automatycznie synchronizowane, a domena synchronizacji jest całą treścią kodu dla klasy. Jeśli kod w stosie wywołań elementu członkowskiego wywołuje Wait metodę i określa true
exitContext
metodę , wątek kończy domenę synchronizacji, umożliwiając wątkowi zablokowanemu wywołaniu dowolnego elementu członkowskiego obiektu. Wait Gdy metoda zwróci metodę, wątek, który wykonał wywołanie, musi czekać, aby ponownie wprowadzić domenę synchronizacji.