Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Metoda Wait(Object, Int32, Boolean)
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 zwolni blokadę bez uprzedniego wywołania metody Pulse lub 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ść zwracaną przez metodę Wait, aby określić, czy ponownie odblokowała przed przekroczeniem limitu czasu. Wątek może ocenić warunki, które spowodowały umieszczenie w oczekiwaniu, i w razie potrzeby wywołać metodę Wait ponownie.
Gdy wątek wywołuje Wait, zwalnia blokadę i przechodzi do kolejki oczekujących. W tym momencie następny wątek w kolejce gotowości (jeśli istnieje) może przejąć kontrolę nad blokadą. Wątek, który wywołał Wait, pozostaje w kolejce oczekiwania do momentu, aż wątek, który posiada blokadę, wywoła PulseAll, lub jest następny w kolejce i wątek, który posiada blokadę, wywoła Pulse.
millisecondsTimeout Jednak jeśli upłynie on, zanim inny wątek wywoła metodę Pulse lub PulseAll tego obiektu, pierwotny wątek zostanie przeniesiony do kolejki gotowych w celu odzyskania blokady.
Uwaga / Notatka
Jeśli parametr Infinite jest określony przez millisecondsTimeout, ta metoda blokuje się na czas nieokreślony, chyba że posiadacz blokady wywoła Pulse 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 wykonuje Wait jednokrotnie, niezależnie od tego, ile razy Enter zostało wywołane dla określonego obiektu. Koncepcyjnie, metoda Wait przechowuje liczbę wywołań Enter na obiekcie i wywołuje Exit tyle razy, ile jest to konieczne, aby w pełni zwolnić zablokowany obiekt. Podczas oczekiwania na ponowne uzyskanie obiektu, wywołujący blokuje się. 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 / Notatka
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.
Metoda Wait(Object, TimeSpan, Boolean)
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 zwolni blokadę bez uprzedniego wywołania metody Pulse lub 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ść zwracaną przez metodę Wait, aby określić, czy ponownie odblokowała przed przekroczeniem limitu czasu. Wątek może ocenić warunki, które spowodowały umieszczenie w oczekiwaniu, i w razie potrzeby wywołać metodę Wait ponownie.
Gdy wątek wywołuje Wait, zwalnia blokadę i przechodzi do kolejki oczekujących. W tym momencie następny wątek w kolejce gotowości (jeśli istnieje) może przejąć kontrolę nad blokadą. Wątek, który wywołał Wait, pozostaje w kolejce oczekiwania do momentu, aż wątek, który posiada blokadę, wywoła PulseAll, lub jest następny w kolejce i wątek, który posiada blokadę, wywoła Pulse. Jednak jeśli timeout milisekundy upłyną, zanim inny wątek wywoła metodę Pulse lub PulseAll tego obiektu, wówczas oryginalny wątek zostanie przeniesiony do kolejki w stanie gotowości w celu odzyskania blokady.
Uwaga / Notatka
Jeśli dla parametru TimeSpan określono wartość reprezentującą timeout -1 milisekundy, ta metoda zostaje zablokowana na czas nieokreślony, chyba że posiadacz blokady wywoła Pulse lub PulseAll. Jeśli wartość timeout to 0 milisekund, wątek wywołujący Wait zwalnia blokadę, a następnie natychmiast przechodzi do kolejki gotowości, aby odzyskać blokadę.
Obiekt wywołujący wykonuje Wait jednokrotnie, niezależnie od tego, ile razy Enter zostało wywołane dla określonego obiektu. Koncepcyjnie, metoda Wait przechowuje liczbę wywołań Enter na obiekcie i wywołuje Exit tyle razy, ile jest to konieczne, aby w pełni zwolnić zablokowany obiekt. Podczas oczekiwania na ponowne uzyskanie obiektu, wywołujący blokuje się. 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 / Notatka
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.
Wyjdź z kontekstu
ParametrexitContext nie ma wpływu, chyba że metodaWait jest wywoływana z wewnątrz niestandardowego kontekstu zarządzanego. Może się tak zdarzyć, jeśli wątek znajduje się wewnątrz wywołania instancji klasy pochodzącej z ContextBoundObject. Nawet jeśli obecnie wykonujesz metodę w klasie, która nie pochodzi z ContextBoundObject, na przykład String, możesz znajdować się w kontekście niestandardowym, jeśli ContextBoundObject znajduje się na stosie w bieżącej domenie aplikacji.
Gdy twój kod jest wykonywany w kontekście niedomyślnym, określenie true dla exitContext powoduje, że wątek opuszcza niedomyślny zarządzany kontekst (tj. przechodzi do kontekstu domyślnego) przed wykonaniem metody Wait. Po zakończeniu wywołania metody powraca do pierwotnego kontekstu innego niż domyślny Wait.
Może to być przydatne, gdy klasa z kontekstem ma zastosowany atrybut SynchronizationAttribute. 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 metodę Wait i określa true dla exitContext, wątek wychodzi z domeny synchronizacji, umożliwiając wątkowi zablokowanemu podczas wywołania dowolnego elementu członkowskiego obiektu kontynuację. Gdy metoda Wait zwróci wynik, wątek, który wykonał wywołanie, musi czekać na ponowne wejście do domeny synchronizacji.