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) | Erklären Sie, dass die angegebene Sperre vom aktuellen Thread angehalten wird (Debug Assert). | |
AssertLockHeld(ILockName, LockManager.LockType, Int64) | Erklären Sie, dass die angegebene Sperre vom aktuellen Thread angehalten wird (Debug Assert). | |
AssertLockNotHeld(Object, LockManager.LockType, Int64) | Erklären Sie, dass die angegebene Sperre nicht vom aktuellen Thread angehalten wird (Debug Assert). | |
AssertLockNotHeld(ILockName, LockManager.LockType, Int64) | Erklären Sie, dass die angegebene Sperre nicht vom aktuellen Thread angehalten wird (Debug Assert). | |
AssertNoLocksHeld(Int64) | Erklären Sie, dass der aktuelle Thread nicht LockManager-Sperren enthält. | |
AssertNoLocksHeld(LockManager.LockType, Int64) | Erklären Sie, dass die angegebene Sperre nicht vom aktuellen Thread angehalten wird (Debug Assert). | |
AssertZeroActiveLockObjects | Assertion, wenn es aktive Sperren im Sperrenmanager gibt (wobei refcount > 0) | |
CompareLockTypes | Vergleicht zwei Sperrtypen (löst, wenn Sperrtypen nicht vergleichbar sind). | |
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 die Standardhashfunktion. (Von Object geerbt.) | |
GetLock(Object, LockManager.LockType, Int64) | Abrufen einer Sperre ab. | |
GetLock(ILockName, LockManager.LockType, Int64) | Rufen Sie eine benannte Sperre ab. | |
GetType | Ruft den Type der aktuellen Instanz ab. (Von Object geerbt.) | |
HasLocks | Gibt true zurück, wenn dieses requestId alle Sperren besitzt | |
Lock(Object, Int64) | Rufen Sie eine Blattmonitorsperre für ein angegebenes Objekt ab. | |
Lock(Object, LockManager.LockType, Int64) | Rufen Sie eine Objektmonitorsperre ab. | |
Lock(ILockName, LockManager.LockType, Int64) | Rufen Sie eine benannte Sperre ab. | |
MemberwiseClone | Erstellt eine flache Kopie des aktuellen Object. (Von Object geerbt.) | |
ReleaseAnyLock | Geben Sie die geschachtelte Sperre eines angegebenen Sperrentyps und -irgendwelcher Name frei. | |
ReleaseLock(Object, LockManager.LockType, Int64) | Geben Sie eine Sperre. | |
ReleaseLock(ILockName, LockManager.LockType, Int64) | Geben Sie eine benannte Sperre. | |
TestLock(Object, LockManager.LockType, Int64) | Test, wenn dieser Thread bereits eine Sperre hält. | |
TestLock(String, LockManager.LockType, Int64) | Test, wenn 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 einzurichten. | |
TryGetLock(ILockName, LockManager.LockType, Int64, Int32) | Rufen Sie eine benannte Sperre ab |
Zum Seitenanfang
Hinweise
Verwalteter Speicher werden Deadlockvermeidung. Alle Sperre muss die LockManager-Sperren verwenden. Jede Sperre wird eine Ebene (eine Position in der Sperrenhierarchie) zugewiesen, und ein beliebiger Vorgang kann er nur anfordern, die in der Hierarchie als nur eine unterbrochene Sperre höher stehen.
LockManager unterstützt das Konzept von "benannten Sperren", z., wenn wir etwas Entität sperren müssen, für die Sie kein stabiles Objekt im Arbeitsspeicher haben, sondern nur einen Namen dieser Entität haben. Beispiele sind Postfach und Datenbank. Jedes Objekt zugeordnet Postfach ein, oder Datenbank kann bzw. zu wechseln, ist der gesamte, den wir Anhand für diese Entität haben, Name, wie eine Datenbank GUID für eine Datenbank oder eine Postfachzahl für ein Postfach. Wir unterstützen Monitorsperren und -Lese-/Schreibsperre für benannte Sperren.
LockManager unterstützt auch gewöhnliches "Objekt sperrt", wenn wir eine bestimmte Objektinstanz im Arbeitsspeicher sperren müssen. Überwachen Sie Sperren werden nur unterstützt derzeit für Objektsperren, die ist dieselbe wie Ausrichtung "in der Sperren" Anweisung C#. Im Gegensatz zum "Sperren" Anweisung nimmt LockManager-Objektsperre durchweg an einer Sperrenhierarchie beteiligt, daher können Sie sie validieren werden verwendet in einer richtigen Reihenfolge.
Eine besondere Variante "der Objektsperre" eine "Blattobjektsperre". Wir müssen die Sperre nicht angeben, die für solche Sperre auf Assemblyebene - Es wird erwartet, dass eine höchst-geschachtelte Sperre immer wird und keine anderen Sperren können übernommen werden, wenn Sie diese Blattsperre enthält.
Benannte "Sperren" werden implementiert, indem dynamisch ein Sperrenobjekt für jeden eindeutigen Namen verknüpft, und sie in einem globalen Wörterbuch gespeichert. Auf eine benannte Sperre so zugreifen muss nach Wörterbuchsuche, ein entsprechendes Sperrenobjekt zu suchen. Das Sperrenobjektwörterbuch, wenn Sie selbst gesperrt sind, während Sie solche Suche ausführen. Alle stellt diesen benannten Sperren möglicherweise Aufwand als gewöhnliche Sperren, aufgrund der zusätzliche Aufwand Sperrens des Wörterbuchs und der Wörterbuchsuche erstellt. Es werden zwei Verfahren, diese Kosten zu verringern: (1) Sperrenobjektwörterbuch Partitionierung, den globalen Sperrkonflikt des Wörterbuchs zu reduzieren, und (2), Bereitstellen Aufrufer die Möglichkeit, den benannten Sperrenobjektverweis zwischenzuspeichern und die Wörterbuchsuche meistens zu umgehen. Beachten Sie, dass allein partitionieren, da nicht viel mit relativ BreitBereichssperren hilft, wie einer Datenbanksperre unzureichend ist; wenn beispielsweise jeder die gleiche gemeinsame Sperre greifen möchte.
Es gibt möglicherweise unendliche eindeutige Zahl Sperrennamen. Deshalb ist die Anzahl von benannten Sperrenobjekten, die wir möglicherweise erstellen können, auch Unendlich. Da Verweise auf Named Sperrenobjekten in einem globalen Wörterbuch gespeichert werden, können diese Objekte der Garbage Collection zugeordnet nie automatisch sein. Daher möchten wir sein, um benannte Sperrenobjekte zu bereinigen, die regelmäßig nicht verwendet werden. Um threadsichere Bereinigung von benannten Sperrenobjekten zu unterstützen, refcounted diese Objekte. Jede Sperre, die auf einen benannten Sperrenobjekt ergriffen wird, erfordert Lassen solchen Objekts "addrefed", der Verweis sollte freigegeben werden, nachdem Sperre aufgehoben wird. Bereinigungslogik überprüft, ob das Objekt nicht direkt verwiesen wird, bevor aus dem Wörterbuch entfernt. Nachdem ein benanntes Sperrenobjekt von einem Wörterbuch entfernt wird, wird es als freigegeben gekennzeichnet, und kann nicht addrefed mehr. Ein Versuch, die gleichen Namen nächsten Mal zu sperren verursacht das Zuordnen eines neuen benannten Sperrenobjekts, das den gleichen Namen und Hinzufügen er zurück zu einem Wörterbuch hat. Daher ist er OK, veraltete benannte Sperrenobjektverweise von einem Aufrufer zwischenspeichern soll - solche veraltete Verweis wird erkannt und aktualisiert beim nächsten Mal, wenn Sie versuchen, ihn zu sperren und einem neuen Sperrenobjekt zuzuordnen.
Wir verwenden einfache Uhrzeit ein basiertes heuristisches, um nicht verwendete Sperrenobjekte zu bereinigen. Auf jedem N, das Sperrenversion genannt wird, ruft uns überprüfen, ob eine Uhrzeit gibt, Bereinigung auszuführen, und dann überprüfen das Wörterbuch und Erfassen alle auf Objekte auf, die nicht zuletzt verwendet werden. Anschließend versuchen wir, jedem solchen Objekt freigeben und den zugehörigen Verweis von einem Wörterbuch zu entfernen. Bereinigung ist pro Wörterbuchpartition, um andere Partitionen nicht sperren müssen, wenn wir Bereinigung für eine gegebene Partition ausführen.
Threadsicherheit
Alle öffentlichen static (Shared in Visual Basic)-Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.