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 Waitelement , 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 Waitelement , 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 trueexitContext , ż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 trueexitContextmetodę , 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.