Share via


LockManager-Klasse

LockManager-Klasse.

Vererbungshierarchie

System.Object
  Microsoft.TeamFoundation.Framework.Server.LockManager

Namespace:  Microsoft.TeamFoundation.Framework.Server
Assembly:  Microsoft.TeamFoundation.Framework.Server (in Microsoft.TeamFoundation.Framework.Server.dll)

Syntax

'Declaration
Public Class LockManager
public class LockManager

Der LockManager-Typ macht die folgenden Member verfügbar.

Konstruktoren

  Name Beschreibung
Öffentliche Methode LockManager Konstruktor

Zum Seitenanfang

Methoden

  Name Beschreibung
Öffentliche Methode AssertLockHeld(Object, LockManager.LockType, Int64) Bestätigen Sie, dass die angegebene vom aktuellen Thread (Debug Assert) gesperrt ist.
Öffentliche Methode AssertLockHeld(ILockName, LockManager.LockType, Int64) Bestätigen Sie, dass die angegebene vom aktuellen Thread (Debug Assert) gesperrt ist.
Öffentliche Methode AssertLockNotHeld(Object, LockManager.LockType, Int64) Bestätigen Sie, dass die angegebene Sperre nicht vom aktuellen Thread (Debug Assert) gehalten wird.
Öffentliche Methode AssertLockNotHeld(ILockName, LockManager.LockType, Int64) Bestätigen Sie, dass die angegebene Sperre nicht vom aktuellen Thread (Debug Assert) gehalten wird.
Öffentliche Methode AssertNoLocksHeld(Int64) Bestätigen Sie, dass der aktuelle Thread keine Sperren LockManager enthält.
Öffentliche Methode AssertNoLocksHeld(LockManager.LockType, Int64) Bestätigen Sie, dass die angegebene Sperre nicht vom aktuellen Thread (Debug Assert) gehalten wird.
Öffentliche Methode AssertZeroActiveLockObjects
Öffentliche MethodeStatischer Member CompareLockTypes Vergleicht zwei Typen (wirft Wenn Lock-Typen nicht vergleichbar sind) gesperrt werden.
Öffentliche Methode Equals Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist. (Von Object geerbt.)
Geschützte Methode Finalize Gibt einem Objekt Gelegenheit zu dem Versuch, Ressourcen freizugeben und andere Bereinigungen durchzuführen, bevor es von der Garbage Collection freigegeben wird. (Von Object geerbt.)
Öffentliche Methode GetHashCode Fungiert als Hashfunktion für einen bestimmten Typ. (Von Object geerbt.)
Öffentliche Methode GetLock(Object, LockManager.LockType, Int64) Eine Sperre zu erhalten.
Öffentliche Methode GetLock(ILockName, LockManager.LockType, Int64) Eine benannte Sperre zu erhalten.
Öffentliche Methode GetType Ruft den Type der aktuellen Instanz ab. (Von Object geerbt.)
Öffentliche Methode Lock(Object, Int64) Eine Blatt Monitorsperre für ein bestimmtes Objekt zu erhalten.
Öffentliche Methode Lock(Object, LockManager.LockType, Int64) Eine Objekt-Monitor-Sperre zu erhalten.
Öffentliche Methode Lock(ILockName, LockManager.LockType, Int64) Eine benannte Sperre zu erhalten.
Geschützte Methode MemberwiseClone Erstellt eine flache Kopie des aktuellen Object. (Von Object geerbt.)
Öffentliche Methode ReleaseAnyLock Lassen Sie die am tiefsten verschachtelten Sperre eines bestimmten Lock-Typs und einen beliebigen Namen.
Öffentliche Methode ReleaseLock(Object, LockManager.LockType, Int64) Freizugeben Sie eine Sperre.
Öffentliche Methode ReleaseLock(ILockName, LockManager.LockType, Int64) Benannte Sperre.
Öffentliche Methode TestLock(Object, LockManager.LockType, Int64) Testen Sie, ob dieser Thread bereits eine Sperre hält.
Öffentliche Methode TestLock(String, LockManager.LockType, Int64) Testen Sie, ob dieser Thread bereits eine Sperre hält.
Öffentliche Methode ToString Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Von Object geerbt.)
Öffentliche Methode TryGetLock(Object, LockManager.LockType, Int64) Versuchen Sie, eine Sperre zu erhalten.
Öffentliche Methode TryGetLock(ILockName, LockManager.LockType, Int64, Int32)

Zum Seitenanfang

Hinweise

Verwalteten Speicher Praktiken Deadlock-Vermeidung.Alle Sperren muss die LockManager Sperren verwenden.Jede Sperre ist eine Ebene (eine Position in der Hierarchie Sperren) zugewiesen, und jede Operation kann nur Sperren anfordern, die in der Hierarchie höher als jede Sperre derzeit sind.

LockManager unterstützt das Konzept der "named sperren", e.g. Wenn wir einige Entität für die möglicherweise nicht haben wir eine stabile Objekt im Speicher sperren müssen, aber nur ein Name eines solchen Unternehmens haben.Beispiele sind Postfach und Datenbank.Jedes Objekt, das Postfach oder der Datenbank zugeordneten kommen und gehen kann, alle wir Testing für diese Person ihre Namen, z. B. eine Datenbank-GUID für eine Datenbank oder Postfach-Nummer für ein Postfach ist.Wir unterstützen die Monitor-Sperren und Reader / Writer-Sperren für benannte sperren.

LockManager unterstützt auch die gewöhnlichen "Objekt sperren", wenn müssen wir eine Instanz des bestimmten Objekts im Speicher sperren.Nur Monitor Sperren für Objektsperren werden derzeit unterstützt, die die gleiche Verriegelung wie in c# "Lock"-Anweisung verwendet.Im Gegensatz zu der Anweisung "Lock" Objektsperre vollständig in einer Hierarchie Sperren beteiligt sich LockManager können wir daher überprüfen, dass sie in der korrekten Abfolge verwendet werden.

Ein Sonderfall der "Objekt sperren" ist "Leaf Objekt sperren".Wir haben nicht die Sperre für diese Sperre angeben - es immer eine Sperre für die meisten geschachtelt werden soll und keine anderen Sperren getroffen werden können, wenn solche Blatt-Sperre.

"Mit dem Namen" Sperren "werden dynamisch reservieren eines Sperrobjekts für jeden eindeutigen Namen und speichert sie in ein globales Wörterbuch implementiert.Damit den Zugriff auf eine benannte Sperre, namentlich erfordert Wörterbuchsuche entsprechende Lock-Objekt zu finden.Selbst sollte das Lock-Wörterbuch gesperrt werden, während Sie solche Lookup durchführen.All dies macht benannte Sperren aufgrund der zusätzlichen Kosten für das Sperren des Wörterbuchs und eines Wörterbuchs potenziell teurer als normale sperren.Wir verwenden zwei Techniken, um solche Kosten zu reduzieren: (1) Partitionierung Lock Objekt Wörterbuch der globalen Wörterbuch Sperrenkonflikte zu reduzieren und (2) Aufrufer der Möglichkeit zum Zwischenspeichern von benannten Lock-Objektverweis, und umgehen die Wörterbuchsuche die meiste Zeit.Beachten Sie, dass die Partitionierung allein nicht ausreichend ist, da es nicht viel mit relativ umfassenden Bereich sperren, wie z. B. eine Datenbanksperre hilft; beispielsweise freigegeben wenn jeder dasselbe greifen möchte Sperre.

Es gibt potenziell unbegrenzten Anzahl von eindeutigen Lock Namen.Daher ist die Anzahl der benannten Sperren von Objekten, die wir möglicherweise erstellen können auch unbegrenzt.Da Verweise auf benannte Sperren von Objekten in ein globales Wörterbuch gespeichert werden, könnten solche Objekte nie automatisch von der Garbage Collection freigegeben werden.Daher wollen wir in der Lage benannte Sperrobjekte bereinigen, die nicht regelmäßig verwendet werden.Um threadsichere Bereinigung der benannten Sperren von Objekten unterstützen, sind solche Objekte Refcounted.Jede Sperre, die auf eine benannte Sperrobjekt muss ein solches Objekt "Addrefed", der Verweis freigegeben werden soll, nachdem die Sperre aufgehoben wird.Bereinigungslogik überprüft, dass das Objekt nicht aktuell verwiesen wird, bevor Sie Sie aus dem Wörterbuch entfernen.Nach dem Entfernen einer benannten Lock-Objekt aus einem Wörterbuch ist als freigegeben markiert und kann nicht mehr Addrefed werden.Ein Versuch, den gleichen Namen zu nächsten Sperren verursacht, reservieren ein neue benannte Lock-Objekt mit den gleichen Namen und Hinzufügen eines Wörterbuchs zurück.So ist es OK veraltete haben mit dem Namen Lock Objektverweise, die von einem Aufrufer zwischengespeichert - Bezugnahme veraltet erkannt und die nächsten Mal aktualisiert, wenn, das wir versuchen, zu sperren und ein neue Lock-Objekt zuweisen.

Wir verwenden eine einfache Zeitbasiertes Heuristik nicht verwendeter Sperrobjekte bereinigen.Alle n benannt Sperraufrufe Release, die wir prüfen, ob eine Zeit zu bereinigen, und untersuchen Sie das Wörterbuch und sammeln Sie alle nicht referenzierte Objekte die vor kurzem nicht verwendet werden.Dann versuchen wir jedes Objekt verfügen, und entfernen den Verweis aus einem Wörterbuch.Cleanup ist pro Wörterbuch-Partition, so dass wir keinen anderen Partitionen zu sperren, wenn wir Cleanup für eine bestimmte Partition ausführen.

Threadsicherheit

Alle öffentlichen static (Shared in Visual Basic)-Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Siehe auch

Referenz

Microsoft.TeamFoundation.Framework.Server-Namespace