Freigeben über


System.Threading.Monitor.Wait-Methoden

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Wait(Object, Int32, Boolean)-Methode

Diese Methode wird erst zurückgegeben, wenn eine exklusive Sperre für den obj Parameter erneut ausgeführt wird.

Der Thread, der derzeit die Sperre für das angegebene Objekt besitzt, ruft diese Methode auf, um das Objekt freizugeben, damit ein anderer Thread darauf zugreifen kann. Der Aufrufer wird blockiert, während er wartet, die Sperre erneut zu erhalten. Diese Methode wird aufgerufen, wenn der Aufrufer auf eine Zustandsänderung warten muss, die aufgrund der Vorgänge eines anderen Threads auftritt.

Durch das Timeout wird sichergestellt, dass der aktuelle Thread nicht unbegrenzt blockiert wird, wenn ein anderer Thread die Sperre loslässt, ohne zuerst die Pulse Methode aufzurufen PulseAll . Außerdem verschiebt er den Thread in die bereite Warteschlange, um andere Threads davor in der Warteschleife zu umgehen, damit die Sperre früher erneut angefordert werden kann. Der Thread kann den Rückgabewert der Wait Methode testen, um festzustellen, ob die Sperre vor dem Timeout erneut abgerufen wurde. Der Thread kann die Bedingungen auswerten, die dazu geführt haben, dass er in die Wartezeit eintritt, und bei Bedarf erneut die Wait Methode aufrufen.

Wenn ein Thread aufruft Wait, gibt er die Sperre frei und wechselt in die Warteschleife. An diesem Punkt kann der nächste Thread in der bereiten Warteschlange (sofern vorhanden) die Kontrolle über die Sperre übernehmen. Der Thread, der erneut Standard in der Warteschleife aufgerufen wirdWait, bis entweder ein Thread, der die Sperre aufruftPulseAll, oder es ist die nächste in der Warteschlange und ein Thread, der die Sperre aufruftPulse. Wenn millisecondsTimeout jedoch verstrichen ist, bevor ein anderer Thread die Methode Pulse oder PulseAll Methode dieses Objekts aufruft, wird der ursprüngliche Thread in die bereite Warteschlange verschoben, um die Sperre wieder zu erhalten.

Hinweis

Wenn Infinite für den millisecondsTimeout Parameter angegeben wird, wird diese Methode unbegrenzt blockiert, es sei denn, der Inhaber der Sperraufrufe Pulse oder PulseAll. Wenn millisecondsTimeout gleich 0 ist, gibt der Thread, der die Sperre aufruft Wait , sofort in die bereite Warteschlange ein, um die Sperre wieder zu erhalten.

Der Aufrufer wird einmal ausgeführt Wait , unabhängig von der Anzahl der Aufrufe Enter für das angegebene Objekt. Konzeptionell speichert die Wait Methode die Häufigkeit, mit der der Aufrufer für das Objekt aufgerufen Enter wird, und ruft so oft wie nötig auf Exit , um das gesperrte Objekt vollständig freizugeben. Der Aufrufer blockiert dann, während darauf gewartet wird, das Objekt erneut abzurufen. Wenn der Aufrufer die Sperre erneut abruft, ruft Enter das System so oft wie nötig auf, um die gespeicherte Enter Anzahl für den Anrufer wiederherzustellen. Durch Aufrufen Wait wird die Sperre nur für das angegebene Objekt freigegeben. Wenn der Aufrufer der Besitzer von Sperren für andere Objekte ist, werden diese Sperren nicht freigegeben.

Hinweis

Ein synchronisiertes Objekt enthält mehrere Verweise, einschließlich eines Verweises auf den Thread, der derzeit die Sperre enthält, einen Verweis auf die bereite Warteschlange, die die Threads enthält, die zum Abrufen der Sperre bereit sind, und einen Verweis auf die Warteschleife, die die Threads enthält, die auf eine Benachrichtigung über eine Änderung im Zustand des Objekts warten.

Die PulseMethoden PulseAllund Wait Methoden müssen innerhalb eines synchronisierten Codeblocks aufgerufen werden.

In den Hinweisen für die Pulse Methode wird erläutert, was passiert, wenn Pulse keine Threads warten.

Wait(Object, TimeSpan, Boolean)-Methode

Diese Methode wird erst zurückgegeben, wenn eine exklusive Sperre für den obj Parameter erneut ausgeführt wird.

Der Thread, der derzeit die Sperre für das angegebene Objekt besitzt, ruft diese Methode auf, um das Objekt freizugeben, damit ein anderer Thread darauf zugreifen kann. Der Aufrufer wird blockiert, während er wartet, die Sperre erneut zu erhalten. Diese Methode wird aufgerufen, wenn der Aufrufer auf eine Zustandsänderung warten muss, die aufgrund der Vorgänge eines anderen Threads auftritt.

Durch das Timeout wird sichergestellt, dass der aktuelle Thread nicht unbegrenzt blockiert wird, wenn ein anderer Thread die Sperre loslässt, ohne zuerst die Pulse Methode aufzurufen PulseAll . Außerdem verschiebt er den Thread in die bereite Warteschlange, um andere Threads davor in der Warteschleife zu umgehen, damit die Sperre früher erneut angefordert werden kann. Der Thread kann den Rückgabewert der Wait Methode testen, um festzustellen, ob die Sperre vor dem Timeout erneut abgerufen wurde. Der Thread kann die Bedingungen auswerten, die dazu geführt haben, dass er in die Wartezeit eintritt, und bei Bedarf erneut die Wait Methode aufrufen.

Wenn ein Thread aufruft Wait, gibt er die Sperre frei und wechselt in die Warteschleife. An diesem Punkt kann der nächste Thread in der bereiten Warteschlange (sofern vorhanden) die Kontrolle über die Sperre übernehmen. Der Thread, der erneut Standard in der Warteschleife aufgerufen wirdWait, bis entweder ein Thread, der die Sperre aufruftPulseAll, oder es ist die nächste in der Warteschlange und ein Thread, der die Sperre aufruftPulse. Wenn timeout jedoch Millisekunden ablaufen, bevor ein anderer Thread die Methode Pulse oder PulseAll Methode dieses Objekts aufruft, wird der ursprüngliche Thread in die bereite Warteschlange verschoben, um die Sperre wieder zu erhalten.

Hinweis

Wenn für den timeout Parameter eine TimeSpan Darstellung von -1 Millisekunden angegeben ist, wird diese Methode unbegrenzt blockiert, es sei denn, der Inhaber der Sperraufrufe Pulse oder PulseAll. Wenn timeout 0 Millisekunden vorhanden sind, gibt der Thread, der die Sperre aufruft Wait , sofort in die bereite Warteschlange ein, um die Sperre wieder zu erhalten.

Der Aufrufer wird einmal ausgeführt Wait , unabhängig von der Anzahl der Aufrufe Enter für das angegebene Objekt. Konzeptionell speichert die Wait Methode die Häufigkeit, mit der der Aufrufer für das Objekt aufgerufen Enter wird, und ruft so oft wie nötig auf Exit , um das gesperrte Objekt vollständig freizugeben. Der Aufrufer blockiert dann, während darauf gewartet wird, das Objekt erneut abzurufen. Wenn der Aufrufer die Sperre erneut abruft, ruft Enter das System so oft wie nötig auf, um die gespeicherte Enter Anzahl für den Anrufer wiederherzustellen. Durch Aufrufen Wait wird die Sperre nur für das angegebene Objekt freigegeben. Wenn der Aufrufer der Besitzer von Sperren für andere Objekte ist, werden diese Sperren nicht freigegeben.

Hinweis

Ein synchronisiertes Objekt enthält mehrere Verweise, einschließlich eines Verweises auf den Thread, der derzeit die Sperre enthält, einen Verweis auf die bereite Warteschlange, die die Threads enthält, die zum Abrufen der Sperre bereit sind, und einen Verweis auf die Warteschleife, die die Threads enthält, die auf eine Benachrichtigung über eine Änderung im Zustand des Objekts warten.

Die PulseMethoden PulseAllund Wait Methoden müssen innerhalb eines synchronisierten Codeblocks aufgerufen werden.

In den Hinweisen für die Pulse Methode wird erläutert, was passiert, wenn Pulse keine Threads warten.

Beenden des Kontexts

DerexitContext Parameter hat keine Auswirkung, es sei denn, die Wait Methode wird aus einem nicht standardmäßigen verwalteten Kontext aufgerufen. Dies kann passieren, wenn sich Ihr Thread innerhalb eines Aufrufs einer Instanz einer klasse befindet, die von ContextBoundObject. Auch wenn Sie derzeit eine Methode für eine Klasse ausführen, die nicht von ContextBoundObject, zString. B. abgeleitet ist, können Sie sich in einem nicht standardmäßigen Kontext befinden, wenn sich ein ContextBoundObject Stapel in der aktuellen Anwendung befindet Standard.

Wenn Der Code in einem nicht standardmäßigen Kontext ausgeführt wird, geben Sie true an exitContext , dass der Thread den nicht standardmäßigen verwalteten Kontext (d. h. zum Übergang zum Standardkontext) beendet, bevor die Wait Methode ausgeführt wird. Nach Abschluss des Aufrufs der Wait Methode wird der ursprüngliche Nicht-Standardkontext zurückgegeben.

Dies kann nützlich sein, wenn die kontextgebundene Klasse das SynchronizationAttribute Attribut angewendet hat. In diesem Fall werden alle Aufrufe an Member der Klasse automatisch synchronisiert, und die Synchronisierung erfolgt Standard ist der gesamte Codetext für die Klasse. Wenn Code im Aufrufstapel eines Elements die Wait Methode aufruft und angibt trueexitContext, beendet der Thread die Synchronisierung Standard, sodass ein Thread, der für einen Aufruf eines Elements des Objekts blockiert wird, fortgesetzt werden kann. Wenn die Wait Methode zurückgegeben wird, muss der Thread, der den Aufruf ausgeführt hat, warten, bis die Synchronisierung erneut ausgeführt wird Standard.