Classe LockManager
Classe di LockManager.
Gerarchia di ereditarietà
System.Object
Microsoft.TeamFoundation.Framework.Server.LockManager
Spazio dei nomi: Microsoft.TeamFoundation.Framework.Server
Assembly: Microsoft.TeamFoundation.Framework.Server (in Microsoft.TeamFoundation.Framework.Server.dll)
Sintassi
'Dichiarazione
Public Class LockManager
public class LockManager
Il tipo LockManager espone i seguenti membri.
Costruttori
Nome | Descrizione | |
---|---|---|
LockManager | Costruttore |
In alto
Metodi
Nome | Descrizione | |
---|---|---|
AssertLockHeld(Object, LockManager.LockType, Int64) | Asserzione che il blocco specificato viene utilizzato dal thread corrente (l'asserzione di debug. | |
AssertLockHeld(ILockName, LockManager.LockType, Int64) | Asserzione che il blocco specificato viene utilizzato dal thread corrente (l'asserzione di debug. | |
AssertLockNotHeld(Object, LockManager.LockType, Int64) | Asserzione che il blocco specificato non viene utilizzato dal thread corrente (l'asserzione di debug. | |
AssertLockNotHeld(ILockName, LockManager.LockType, Int64) | Asserzione che il blocco specificato non viene utilizzato dal thread corrente (l'asserzione di debug. | |
AssertNoLocksHeld(Int64) | Asserzione che il thread corrente non contiene blocchi di LockManager. | |
AssertNoLocksHeld(LockManager.LockType, Int64) | Asserzione che il blocco specificato non viene utilizzato dal thread corrente (l'asserzione di debug. | |
AssertZeroActiveLockObjects | Le asserzioni IFF presenti blocchi attivi in gestione di blocco (dove refcount > 0) | |
CompareLockTypes | Confronta due tipi di blocco (genera un'eccezione se i tipi di blocchi non sono paragonabili). | |
Equals | Determina se l'oggetto specificato equivale all'oggetto corrente. (Ereditato da Object) | |
Finalize | Consente a un oggetto di provare a liberare risorse ed eseguire altre operazioni di pulitura prima che l'oggetto stesso venga recuperato dalla procedura di Garbage Collection. (Ereditato da Object) | |
GetHashCode | Funge da funzione hash predefinita. (Ereditato da Object) | |
GetLock(Object, LockManager.LockType, Int64) | Ottenere un blocco. | |
GetLock(ILockName, LockManager.LockType, Int64) | Ottenere un blocco denominato. | |
GetType | Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object) | |
HasLocks | Restituisce true se questo requestId possiede dei blocchi | |
Lock(Object, Int64) | Ottenere un blocco di monitoraggio foglia per un oggetto specificato. | |
Lock(Object, LockManager.LockType, Int64) | Ottenere un blocco di monitoraggio dell'oggetto. | |
Lock(ILockName, LockManager.LockType, Int64) | Ottenere un blocco denominato. | |
MemberwiseClone | Consente di creare una copia dei riferimenti dell'oggetto Object corrente. (Ereditato da Object) | |
ReleaseAnyLock | Rilasciare il blocco più annidato di tipo specificato e di una parte del nome. | |
ReleaseLock(Object, LockManager.LockType, Int64) | Rilasciare un blocco. | |
ReleaseLock(ILockName, LockManager.LockType, Int64) | Rilasciare un blocco denominato. | |
TestLock(Object, LockManager.LockType, Int64) | Verifica se il thread è già utilizzato un blocco. | |
TestLock(String, LockManager.LockType, Int64) | Verifica se il thread è già utilizzato un blocco. | |
ToString | Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) | |
TryGetLock(Object, LockManager.LockType, Int64) | Provare a ottenere un blocco. | |
TryGetLock(ILockName, LockManager.LockType, Int64, Int32) | Ottenere un blocco denominato |
In alto
Note
L'archivio gestito pratica di evitare di deadlock. Qualsiasi blocco deve utilizzare blocchi di LockManager. A ogni blocco viene assegnato un livello (una posizione nella gerarchia del blocco) e qualsiasi operazione può richiedere solo i blocchi che sono più in alto nella gerarchia che qualsiasi blocco attualmente in uso.
LockManager supporta il concetto di "denominato i blocchi", ad esempio quando è necessario bloccare una determinata entità per il quale non è possibile avere un oggetto in memoria stabile, ma è semplicemente un nome di tale entità. Gli esempi sono la cassetta postale e database. Qualsiasi oggetto associato alla cassetta postale o il database può interrompere e passare, è importante valutare se per tale entità costituisce il nome, ad esempio un database GUID per un database o un numero della cassetta postale di una cassetta postale. Sono i blocchi e i blocchi reader/writer di monitoraggio dei blocchi denominati.
LockManager supporta anche "oggetto comune si blocca", quando è necessario bloccare un oggetto specifico in memoria. Monitorare i blocchi solo sono attualmente supportati per i blocchi dell'oggetto, ovvero lo stesso meccanismo di blocco come utilizzato nell'istruzione "blocco" c ". Contrariamente all'istruzione "blocco", il blocco dell'oggetto di LockManager completamente fa parte di una gerarchia del blocco, sarà possibile eseguirne il test sono utilizzati in un ordine corretto.
Un caso speciale "blocco dell'oggetto" è un "blocco dell'oggetto foglia". Non è necessario specificare il livello di blocco per tale blocco - si prevede che sempre un blocco più annidato e nessun altro blocco può essere creato quando si utilizza tale blocco foglia.
"Denominato i blocchi" vengono implementati in modo dinamico allocando un oggetto blocco per ogni nome univoco e l'archiviazione in un dizionario globale. Pertanto accedere a un blocco denominato per nome richiede la consultazione di dizionari di trovare un oggetto corrispondente del blocco. Il dizionario se stesso dell'oggetto blocco sia bloccato durante tale ricerca. Questo rende i blocchi denominati potenzialmente più costosi dei blocchi comuni, a causa del costo aggiuntivo di bloccare una consultazione di dizionari di dizionario e. È possibile utilizzare due tecniche per ridurre tale rischio: (1) divisione del dizionario dell'oggetto blocco, per ridurre i conflitti di blocco globali di dizionario e (2) fornendo il chiamante la possibilità di memorizzare il riferimento a un oggetto denominato e il blocco di ignorare la consultazione di dizionari per la maggior parte dei casi. Si noti che il partizionamento per intervalli da solo non è sufficiente perché non consente di relativamente ai blocchi di ampio- ambito, ad esempio un blocco del database; ad esempio, quando tutti desidera selezionare lo stesso blocco condiviso.
Esiste un numero potenzialmente non associato dei nomi univoci del blocco. Di conseguenza, il numero di oggetti denominati che il blocco è possibile creare potenzialmente non è associato. Poiché i riferimenti agli oggetti denominati di blocco sono archiviati in un dizionario globale, tali oggetti possono mai essere sottoposti automaticamente a garbage collection. Pertanto si desidera consentire agli oggetti di blocco denominati pulitura non utilizzate regolarmente. Per supportare la pulizia thread-safe degli oggetti denominati il blocco, tali oggetti refcounted. Ogni blocco eseguito su un oggetto denominato del blocco è necessario eseguire tale addrefed "oggetto", il riferimento deve essere eliminato dopo il rilascio del blocco. Controlli della logica di pulizia che l'oggetto attualmente non viene fatto riferimento prima di rimuoverlo dal dizionario. Dopo che un oggetto denominato del blocco viene rimosso da un dizionario, viene contrassegnato come eliminato e non può essere addrefed altro. Se si tenta di bloccare lo stesso nome della volta successiva causerà allocare un nuovo oggetto denominato di blocco con lo stesso nome e aggiungerlo di nuovo a un dizionario. Pertanto può rendere i riferimenti agli oggetti denominati non aggiornati di blocco memorizzare nella cache da un chiamante - tale riferimento non aggiornato verrà rilevato e aggiornati alla successiva apertura di seguito per bloccare e allocare un nuovo oggetto blocco.
Viene utilizzato un euristico tempo semplice in base agli oggetti inutilizzati del blocco di pulizia. In ogni versione del blocco denominata N si chiama per verificare se esiste un tempo impiegato per eseguire la pulizia e quindi esamina il dizionario e raccoglie tutti gli oggetti senza riferimenti non utilizzati di recente. Quindi si tenta di eliminare ogni oggetto e rimuovere il riferimento un dizionario. La pulitura viene per partizione di dizionario, pertanto non è necessario bloccare altre partizioni quando si eseguirà la pulizia per ogni partizione specificata.
Codice thread safe
Qualsiasi membro static (Shared in Visual Basic) pubblico di questo tipo è thread-safe. I membri di istanza non sono garantiti come thread-safe.