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 | |
---|---|---|
LockManager | Konstruktor |
Zum Seitenanfang
Methoden
Name | Beschreibung | |
---|---|---|
AssertLockHeld(Object, LockManager.LockType, Int64) | Bestätigen Sie, dass die angegebene vom aktuellen Thread (Debug Assert) gesperrt ist. | |
AssertLockHeld(ILockName, LockManager.LockType, Int64) | Bestätigen Sie, dass die angegebene vom aktuellen Thread (Debug Assert) gesperrt ist. | |
AssertLockNotHeld(Object, LockManager.LockType, Int64) | Bestätigen Sie, dass die angegebene Sperre nicht vom aktuellen Thread (Debug Assert) gehalten wird. | |
AssertLockNotHeld(ILockName, LockManager.LockType, Int64) | Bestätigen Sie, dass die angegebene Sperre nicht vom aktuellen Thread (Debug Assert) gehalten wird. | |
AssertNoLocksHeld(Int64) | Bestätigen Sie, dass der aktuelle Thread keine Sperren LockManager enthält. | |
AssertNoLocksHeld(LockManager.LockType, Int64) | Bestätigen Sie, dass die angegebene Sperre nicht vom aktuellen Thread (Debug Assert) gehalten wird. | |
AssertZeroActiveLockObjects | ||
CompareLockTypes | Vergleicht zwei Typen (wirft Wenn Lock-Typen nicht vergleichbar sind) gesperrt werden. | |
Equals | Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist. (Von Object geerbt.) | |
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.) | |
GetHashCode | Fungiert als Hashfunktion für einen bestimmten Typ. (Von Object geerbt.) | |
GetLock(Object, LockManager.LockType, Int64) | Eine Sperre zu erhalten. | |
GetLock(ILockName, LockManager.LockType, Int64) | Eine benannte Sperre zu erhalten. | |
GetType | Ruft den Type der aktuellen Instanz ab. (Von Object geerbt.) | |
Lock(Object, Int64) | Eine Blatt Monitorsperre für ein bestimmtes Objekt zu erhalten. | |
Lock(Object, LockManager.LockType, Int64) | Eine Objekt-Monitor-Sperre zu erhalten. | |
Lock(ILockName, LockManager.LockType, Int64) | Eine benannte Sperre zu erhalten. | |
MemberwiseClone | Erstellt eine flache Kopie des aktuellen Object. (Von Object geerbt.) | |
ReleaseAnyLock | Lassen Sie die am tiefsten verschachtelten Sperre eines bestimmten Lock-Typs und einen beliebigen Namen. | |
ReleaseLock(Object, LockManager.LockType, Int64) | Freizugeben Sie eine Sperre. | |
ReleaseLock(ILockName, LockManager.LockType, Int64) | Benannte Sperre. | |
TestLock(Object, LockManager.LockType, Int64) | Testen Sie, ob dieser Thread bereits eine Sperre hält. | |
TestLock(String, LockManager.LockType, Int64) | Testen Sie, ob dieser Thread bereits eine Sperre hält. | |
ToString | Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Von Object geerbt.) | |
TryGetLock(Object, LockManager.LockType, Int64) | Versuchen Sie, eine Sperre zu erhalten. | |
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.