Monitor.Wait Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady.
Przeciążenia
| Nazwa | Opis |
|---|---|
| Wait(Object, Int32, Boolean) |
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki. Ta metoda określa również, czy domena synchronizacji dla kontekstu (jeśli w zsynchronizowanym kontekście) zostanie zakończona przed oczekiwaniem i ponownie zaczekanym później. |
| Wait(Object) |
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. |
| Wait(Object, Int32) |
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki. |
| Wait(Object, TimeSpan) |
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki. |
| Wait(Object, TimeSpan, Boolean) |
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki. Opcjonalnie zamyka domenę synchronizacji dla zsynchronizowanych kontekstów przed oczekiwaniem i następnie ponownie wyszukuje domenę. |
Wait(Object, Int32, Boolean)
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki. Ta metoda określa również, czy domena synchronizacji dla kontekstu (jeśli w zsynchronizowanym kontekście) zostanie zakończona przed oczekiwaniem i ponownie zaczekanym później.
public:
static bool Wait(System::Object ^ obj, int millisecondsTimeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, int millisecondsTimeout, bool exitContext);
public static bool Wait(object obj, int millisecondsTimeout, bool exitContext);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * int * bool -> bool
static member Wait : obj * int * bool -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer, exitContext As Boolean) As Boolean
Parametry
- obj
- Object
Obiekt, na którym należy czekać.
- millisecondsTimeout
- Int32
Liczba milisekund oczekiwania przed wejściem wątku do kolejki gotowej.
- exitContext
- Boolean
true aby zamknąć i ponownie uzyskać domenę synchronizacji dla kontekstu (jeśli w zsynchronizowanym kontekście) przed oczekiwaniem; w przeciwnym razie, false.
Zwraca
true jeśli blokada została odzyskana przed upływem określonego czasu; false jeśli blokada została odzyskana po upływie określonego czasu. Metoda nie zwraca się, dopóki blokada nie zostanie ponownie zwrócona.
- Atrybuty
Wyjątki
Parametr obj jest null.
Wait nie jest wywoływany z zsynchronizowanego bloku kodu.
Wątek, który wywołuje Wait , zostanie później przerwany ze stanu oczekiwania. Dzieje się tak, gdy inny wątek wywołuje metodę tego wątku Interrupt() .
Wartość parametru millisecondsTimeout jest ujemna i nie jest równa Infinite.
Uwagi
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.
Note
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.
Note
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.
Note
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.
Note
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
Parametr exitContext 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 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.
Zobacz też
Dotyczy
Wait(Object)
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady.
public:
static bool Wait(System::Object ^ obj);
public static bool Wait(object obj);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj);
static member Wait : obj -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj -> bool
Public Shared Function Wait (obj As Object) As Boolean
Parametry
- obj
- Object
Obiekt, na którym należy czekać.
Zwraca
true jeśli wywołanie zostało zwrócone, ponieważ obiekt wywołujący ponownie zwrócił blokadę określonego obiektu. Ta metoda nie zwraca się, jeśli blokada nie jest ponownie wymagane.
- Atrybuty
Wyjątki
Parametr obj jest null.
Wątek wywołujący nie jest właścicielem blokady dla określonego obiektu.
Wątek, który wywołuje Wait , zostanie później przerwany ze stanu oczekiwania. Dzieje się tak, gdy inny wątek wywołuje metodę tego wątku Interrupt() .
Uwagi
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.
Gdy wątek wywołuje Waitmetodę , zwalnia blokadę obiektu i wprowadza kolejkę oczekującą obiektu. Następny wątek w gotowej kolejce obiektu (jeśli istnieje) uzyskuje blokadę i ma wyłączne użycie obiektu. Wszystkie wątki wywołujące Wait pozostają w kolejce oczekiwania, dopóki nie otrzymają sygnału od Pulse lub PulseAll, wysłane przez właściciela blokady. W przypadku Pulse wysłania problem dotyczy tylko wątku na czele kolejki oczekiwania. W przypadku PulseAll wysłania dotyczy to wszystkich wątków oczekujących na obiekt. Po odebraniu sygnału co najmniej jeden wątek pozostaw kolejkę oczekującą i wprowadź gotową kolejkę. Wątek w gotowej kolejce może odzyskać blokadę.
Ta metoda jest zwracana, gdy wątek wywołujący ponownie odwołuje blokadę obiektu. Należy pamiętać, że ta metoda blokuje się na czas nieokreślony, jeśli uchwyt blokady nie wywołuje Pulse metody lub PulseAll.
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.
Należy pamiętać, że 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 oczekiwania, 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.
Zobacz też
Dotyczy
Wait(Object, Int32)
- Źródło:
- Monitor.CoreCLR.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.CoreCLR.cs
- Źródło:
- Monitor.CoreCLR.cs
- Źródło:
- Monitor.CoreCLR.cs
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki.
public:
static bool Wait(System::Object ^ obj, int millisecondsTimeout);
public static bool Wait(object obj, int millisecondsTimeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, int millisecondsTimeout);
static member Wait : obj * int -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * int -> bool
Public Shared Function Wait (obj As Object, millisecondsTimeout As Integer) As Boolean
Parametry
- obj
- Object
Obiekt, na którym należy czekać.
- millisecondsTimeout
- Int32
Liczba milisekund oczekiwania przed wejściem wątku do kolejki gotowej.
Zwraca
true jeśli blokada została odzyskana przed upływem określonego czasu; false jeśli blokada została odzyskana po upływie określonego czasu. Metoda nie zwraca się, dopóki blokada nie zostanie ponownie zwrócona.
- Atrybuty
Wyjątki
Parametr obj jest null.
Wątek wywołujący nie jest właścicielem blokady dla określonego obiektu.
Wątek, który wywołuje Wait , zostanie później przerwany ze stanu oczekiwania. Dzieje się tak, gdy inny wątek wywołuje metodę tego wątku Interrupt() .
Wartość parametru millisecondsTimeout jest ujemna i nie jest równa Infinite.
Uwagi
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 Waitmetodę , zwalnia blokadę obiektu i wprowadza kolejkę oczekującą obiektu. Następny wątek w gotowej kolejce obiektu (jeśli istnieje) uzyskuje blokadę i ma wyłączne użycie obiektu. 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.
Note
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.
Note
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.
Zobacz też
Dotyczy
Wait(Object, TimeSpan)
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki.
public:
static bool Wait(System::Object ^ obj, TimeSpan timeout);
public static bool Wait(object obj, TimeSpan timeout);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, TimeSpan timeout);
static member Wait : obj * TimeSpan -> bool
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * TimeSpan -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan) As Boolean
Parametry
- obj
- Object
Obiekt, na którym należy czekać.
- timeout
- TimeSpan
Reprezentująca TimeSpan ilość czasu oczekiwania przed wejściem wątku do gotowej kolejki.
Zwraca
true jeśli blokada została odzyskana przed upływem określonego czasu; false jeśli blokada została odzyskana po upływie określonego czasu. Metoda nie zwraca się, dopóki blokada nie zostanie ponownie zwrócona.
- Atrybuty
Wyjątki
Parametr obj jest null.
Wątek wywołujący nie jest właścicielem blokady dla określonego obiektu.
Wątek, który wywołuje Wait , zostanie później przerwany ze stanu oczekiwania. Dzieje się tak, gdy inny wątek wywołuje metodę tego wątku Interrupt() .
Wartość parametru timeout w milisekundach jest ujemna i nie reprezentuje Infinite (-1 milisekund) lub jest większa niż Int32.MaxValue.
Uwagi
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 Waitmetodę , zwalnia blokadę obiektu i wprowadza kolejkę oczekującą obiektu. Następny wątek w gotowej kolejce obiektu (jeśli istnieje) uzyskuje blokadę i ma wyłączne użycie obiektu. 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.
timeout 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.
Note
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.
Note
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.
Zobacz też
Dotyczy
Wait(Object, TimeSpan, Boolean)
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
- Źródło:
- Monitor.cs
Zwalnia blokadę obiektu i blokuje bieżący wątek, dopóki nie odzyska blokady. Jeśli określony interwał limitu czasu upłynie, wątek przechodzi do gotowej kolejki. Opcjonalnie zamyka domenę synchronizacji dla zsynchronizowanych kontekstów przed oczekiwaniem i następnie ponownie wyszukuje domenę.
public:
static bool Wait(System::Object ^ obj, TimeSpan timeout, bool exitContext);
[System.Runtime.Versioning.UnsupportedOSPlatform("browser")]
public static bool Wait(object obj, TimeSpan timeout, bool exitContext);
public static bool Wait(object obj, TimeSpan timeout, bool exitContext);
[<System.Runtime.Versioning.UnsupportedOSPlatform("browser")>]
static member Wait : obj * TimeSpan * bool -> bool
static member Wait : obj * TimeSpan * bool -> bool
Public Shared Function Wait (obj As Object, timeout As TimeSpan, exitContext As Boolean) As Boolean
Parametry
- obj
- Object
Obiekt, na którym należy czekać.
- timeout
- TimeSpan
Reprezentująca TimeSpan ilość czasu oczekiwania przed wejściem wątku do gotowej kolejki.
- exitContext
- Boolean
true aby zamknąć i ponownie uzyskać domenę synchronizacji dla kontekstu (jeśli w zsynchronizowanym kontekście) przed oczekiwaniem; w przeciwnym razie, false.
Zwraca
true jeśli blokada została odzyskana przed upływem określonego czasu; false jeśli blokada została odzyskana po upływie określonego czasu. Metoda nie zwraca się, dopóki blokada nie zostanie ponownie zwrócona.
- Atrybuty
Wyjątki
Parametr obj jest null.
Wait nie jest wywoływany z zsynchronizowanego bloku kodu.
Wątek, który wywołuje wait, zostanie później przerwany ze stanu oczekiwania. Dzieje się tak, gdy inny wątek wywołuje metodę tego wątku Interrupt() .
Parametr timeout jest ujemny i nie reprezentuje Infinite (-1 milisekundy) lub jest większy niż Int32.MaxValue.
Uwagi
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.
Note
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.
Note
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.
Note
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.
Note
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
Parametr exitContext 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 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.