Freigeben über


Monitor-Klasse

Stellt einen Mechanismus bereit, der den Zugriff auf Objekte synchronisiert.

Namespace: System.Threading
Assembly: mscorlib (in mscorlib.dll)

Syntax

'Declaration
<ComVisibleAttribute(True)> _
Public NotInheritable Class Monitor
'Usage
Auf die Member einer statischen Klassen wird direkt ohne Instanz der Klasse zugegriffen.
[ComVisibleAttribute(true)] 
public static class Monitor
[ComVisibleAttribute(true)] 
public ref class Monitor abstract sealed
/** @attribute ComVisibleAttribute(true) */ 
public final class Monitor
ComVisibleAttribute(true) 
public final class Monitor

Hinweise

Hinweis

Das auf diese Klasse angewendete HostProtectionAttribute-Attribut besitzt den Resources-Eigenschaftenwert Synchronization | ExternalThreading. Das HostProtectionAttribute hat keine Auswirkungen auf Desktopanwendungen (die normalerweise durch Doppelklicken auf ein Symbol, Eingeben eines Befehls oder eines URL in einem Browser gestartet werden). Weitere Informationen finden Sie unter der HostProtectionAttribute-Klasse oder unter SQL Server-Programmierung und Hostschutzattribute.

Die Monitor-Klasse steuert den Zugriff auf Objekte, indem Sie einem einzelnen Thread eine Sperre für ein Objekt zuteilt. Mit Objektsperren kann der Zugriff auf einen Codeblock eingeschränkt werden, der allgemein kritischer Abschnitt genannt wird. Während ein Thread die Sperre für ein Objekt besitzt, kann kein anderer Thread diese Sperre erhalten. Sie können mit Monitor auch sicherstellen, dass keinem anderen Thread der Zugriff auf einen vom Sperrenbesitzer ausgeführten Anwendungscodebereich gewährt wird, es sei denn, der andere Thread führt den Code unter Verwendung eines anderen gesperrten Objekts aus.

Hinweis

Mit Monitor können Sie Objekte (d. h. Verweistypen), aber keine Werttypen sperren. Ausführliche Informationen finden Sie unter Enter und unter dem Thema Monitore.

Monitor verfügt über die folgenden Features:

  • Er wird auf Anforderung einem Objekt zugeordnet.

  • Er ist ungebunden, d. h., es ist ein direkter Aufruf aus einem beliebigen Kontext möglich.

  • Eine Instanz der Monitor-Klasse kann nicht erstellt werden.

Die folgenden Informationen werden für jedes synchronisierte Objekt unterhalten:

  • Ein Verweis auf den Thread, der die Sperre derzeit besitzt.

  • Ein Verweis auf eine Warteschlange für noch zu bearbeitende Threads mit den Threads, die die Sperre erhalten können.

  • Ein Verweis auf eine Warteschlange für abzuarbeitende Threads mit den Threads, die auf eine Benachrichtigung über eine Zustandsänderung des gesperrten Objekts warten.

In der folgenden Tabelle werden die Aktionen beschrieben, die von Threads mit Zugriff auf synchronisierte Objekte durchgeführt werden können:

Aktion

Beschreibung

Enter, TryEnter

Erhält eine Sperre für ein Objekt. Diese Aktion kennzeichnet außerdem den Beginn eines kritischen Abschnitts. Ein anderer Thread kann nur dann auf den kritischen Abschnitt zugreifen, wenn er die Anweisungen im kritischen Abschnitt unter Verwendung eines anderen gesperrten Objekts ausführt.

Wait

Hebt die Sperre für ein Objekt auf, sodass anderen Threads das Sperren des Objekts und der Zugriff auf das Objekt ermöglicht wird. Der aufrufende Thread wartet, während ein anderer Thread auf das Objekt zugreift. Wartende Threads werden mithilfe von Impulssignalen über Änderungen am Objektzustand benachrichtigt.

Pulse (Signal), PulseAll

Sendet ein Signal an einen oder mehrere wartende Threads. Das Signal benachrichtigt einen wartenden Thread über eine Änderung am Zustand des gesperrten Objekts sowie über die bevorstehende Aufhebung der Sperre durch ihren Besitzer. Der wartende Thread wird in der Warteschlange für abgearbeitete Threads des Objekts platziert, sodass er schließlich die Sperre für das Objekt erhalten kann. Wenn der Thread die Sperre erhalten hat, kann er den neuen Zustand des Objekts überprüfen und ermitteln, ob der angeforderte Zustand erreicht wurde.

Exit

Hebt die Sperre für ein Objekt auf. Diese Aktion kennzeichnet außerdem das Ende eines kritischen Abschnitts, der durch das gesperrte Objekt geschützt ist.

Mit der Enter-Methode und der Exit-Methode werden der Anfang und das Ende eines kritischen Abschnitts gekennzeichnet. Wenn der kritische Abschnitt eine Reihe zusammenhängender Anweisungen enthält, stellt die durch die Enter-Methode erhaltene Sperre sicher, dass nur ein einziger Thread den enthaltenen Code mit dem gesperrten Objekt ausführen kann. In diesem Fall empfiehlt es sich, dass Sie diese Anweisungen in einem try-Block und die Exit-Anweisung in einem finally-Block platzieren. Mithilfe dieser Funktion wird i. d. R. der Zugriff auf eine statische Methode oder eine Instanzmethode einer Klasse synchronisiert. Wenn eine Instanzmethode synchronisierten Threadzugriff erfordert, ruft sie die Enter-Methode und die entsprechende Exit-Methode unter Verwendung der aktuellen Instanz als zu sperrendes Objekt auf. Da nur ein einziger Thread die Sperre für die aktuelle Instanz besitzen kann, kann die Methode von jeweils nur einem Thread ausgeführt werden. Statische Methoden werden auf ähnliche Weise mithilfe des Type der aktuellen Instanz als gesperrtes Objekt geschützt. Die von der Enter-Methode und der Exit-Methode bereitgestellte Funktionalität entspricht der der lock-Anweisung in C# (SyncLock in Visual Basic), wobei lock und SyncLock die Exit-Methode in einem tryfinally-Block (TryFinally in Visual Basic) umschließen, um sicherzustellen, dass der Monitor freigegeben wird.

Wenn ein kritischer Abschnitt eine ganze Methode umfasst, kann die oben beschriebene Sperrfunktion erreicht werden, indem System.Runtime.CompilerServices.MethodImplAttribute in der Methode platziert und der Synchronized-Wert im Konstruktor von MethodImplAttribute angegeben wird. Wenn Sie dieses Attribut verwenden, werden die Enter-Anweisung und die Exit-Anweisung nicht benötigt. Beachten Sie, dass das Attribut bewirkt, dass der aktuelle Thread die Sperre bis zum Beenden der Methode besitzt. Wenn die Sperre früher aufgehoben werden kann, verwenden Sie anstelle des Attributs die Monitor-Klasse oder die C#-Anweisung lock.

Die Enter-Anweisung und die Exit-Anweisung zum Sperren eines bestimmten Objekts bzw. zum Aufheben der Sperre eines bestimmten Objekts können zwar Member- und/oder Klassengrenzen überschreiten, dies wird jedoch nicht empfohlen.

Bei der Auswahl eines Objekts, für das eine Synchronisierung durchgeführt werden soll, sollten Sie nur private oder interne Objekte sperren. Das Sperren externer Objekte kann zu Deadlocks führen, da nicht zum Vorgang gehöriger Code dieselben Objekte auswählen und für andere Zwecke sperren kann.

Vererbungshierarchie

System.Object
  System.Threading.Monitor

Threadsicherheit

Dieser Typ ist bezüglich Multithreadoperationen sicher.

Plattformen

Windows 98, Windows 2000 SP4, Windows CE, Windows Millennium Edition, Windows Mobile für Pocket PC, Windows Mobile für Smartphone, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen.

Versionsinformationen

.NET Framework

Unterstützt in: 2.0, 1.1, 1.0

.NET Compact Framework

Unterstützt in: 2.0, 1.0

Siehe auch

Referenz

Monitor-Member
System.Threading-Namespace
Thread

Weitere Ressourcen

Verwaltetes Threading
Monitore