Classe LockManager
Classe 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) | L'asserzione che il dato blocco dal thread corrente (debug assert). |
![]() |
AssertLockHeld(ILockName, LockManager.LockType, Int64) | L'asserzione che il dato blocco dal thread corrente (debug assert). |
![]() |
AssertLockNotHeld(Object, LockManager.LockType, Int64) | L'asserzione che il blocco specificato non è mantenuto dal thread corrente (debug assert). |
![]() |
AssertLockNotHeld(ILockName, LockManager.LockType, Int64) | L'asserzione che il blocco specificato non è mantenuto dal thread corrente (debug assert). |
![]() |
AssertNoLocksHeld(Int64) | L'asserzione che il thread corrente blocchi non LockManager. |
![]() |
AssertNoLocksHeld(LockManager.LockType, Int64) | L'asserzione che il blocco specificato non è mantenuto dal thread corrente (debug assert). |
![]() |
AssertZeroActiveLockObjects | |
![]() ![]() |
CompareLockTypes | Confronta due bloccare tipi (genera se i tipi di blocco 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 per un determinato tipo. (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) |
![]() |
Lock(Object, Int64) | Ottenere un blocco di monitor di foglia di un determinato oggetto. |
![]() |
Lock(Object, LockManager.LockType, Int64) | Ottenere un blocco di monitor di 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ù nidificato di un tipo di blocco specificato e un nome qualsiasi. |
![]() |
ReleaseLock(Object, LockManager.LockType, Int64) | Rilasciare un blocco. |
![]() |
ReleaseLock(ILockName, LockManager.LockType, Int64) | Rilasciare un blocco denominato. |
![]() |
TestLock(Object, LockManager.LockType, Int64) | Verificare se il thread contiene già un blocco. |
![]() |
TestLock(String, LockManager.LockType, Int64) | Verificare se il thread contiene già un blocco. |
![]() |
ToString | Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
![]() |
TryGetLock(Object, LockManager.LockType, Int64) | Se si tenta di ottenere un blocco. |
![]() |
TryGetLock(ILockName, LockManager.LockType, Int64, Int32) |
In alto
Note
Archivio gestito pratiche di elusione di deadlock.Tutti i blocchi, è necessario utilizzare i blocchi di LockManager.Ogni blocco viene assegnato un livello (posizione nella gerarchia di blocco) e qualsiasi operazione possibile solo i blocchi di richiesta sono superiori nella gerarchia di qualsiasi blocco attualmente attivo.
LockManager supporta il concetto di "denominato blocchi", e.g. quando è necessario bloccare alcune entità per il quale forse non abbiamo un oggetto stabile in memoria, ma hanno un nome di tale entità.Sono esempi di cassette postali e database.Qualsiasi oggetto associato alla cassetta postale o database possibile i loro spostamenti, possiamo stabile per tale entità è il nome, ad esempio un database GUID per un numero di database o cassetta postale di una cassetta postale.Supportiamo monitor blocchi e blocchi in lettura-scrittura per i blocchi denominati.
LockManager supporta anche un normale oggetto"blocchi", quando è necessario bloccare una particolare istanza di oggetto in memoria.Solo Monitor i blocchi sono attualmente supportati per i blocchi di oggetto, che è lo stesso blocco meccanismo utilizzato nell'istruzione c# "Blocca".In contrasto con l'istruzione "lock", LockManager blocco oggetto completamente partecipa a una gerarchia di blocco, pertanto possiamo verificare utilizzati in modo corretto.
Un caso speciale di "blocco" è un "blocco oggetto foglia".Non è necessario specificare il livello di blocco per tale blocco - è previsto per essere sempre un blocco nidificato la maggior parte e nessun altro blocco può essere eseguito quando tale blocco foglia.
"Denominato blocchi" viene implementato in modo dinamico l'allocazione di un oggetto di blocco per ciascun nome univoco e li memorizza in un dizionario globale.In questo modo l'accesso a un blocco denominato nome richiede ricerche nel dizionario per trovare un oggetto di blocco corrispondente.Il dizionario di oggetti di blocco deve stesso essere bloccato durante l'esecuzione di tale ricerca.Tutto ciò rende potenzialmente più costosi rispetto ai normali blocchi, denominati blocchi a causa dei costi supplementari di bloccare il dizionario e una ricerca nel dizionario.Utilizziamo due tecniche per ridurre tali costi: dizionario oggetto di blocco, per ridurre la contesa di blocco globale del dizionario, il partizionamento (1) e (2) fornendo chiamante la possibilità di memorizzare nella cache il riferimento all'oggetto denominato blocco e la ricerca nel dizionario di ignorare la maggior parte del tempo.Si noti che è insufficiente partizionamento da solo perché non serve molto con blocchi relativamente a livello di ambito, ad esempio un blocco del database; ad esempio, quando tutti gli utenti desiderano acquisire lo stesso condivisa blocco.
È presente un numero potenzialmente illimitato di nomi univoci di blocco.Di conseguenza, il numero di oggetti denominata blocco che è potenzialmente possibile creare anche è illimitato.Poiché i riferimenti agli oggetti di blocco denominato vengono memorizzati in un dizionario globale, tali oggetti non possono essere mai automaticamente raccolto nel Garbage Collector.È quindi necessario essere in grado di pulire gli oggetti denominati blocco che non vengano utilizzati regolarmente.Per supportare la pulitura di thread-safe di oggetti di blocco denominato, tali oggetti sono refcounted.Ogni blocco accettato in un oggetto denominato blocco richiede aventi ad oggetto "addrefed", il riferimento deve essere rilasciato dopo il rilascio del blocco.Logica di pulitura controlla che l'oggetto non fa attualmente riferimento prima di rimuoverla dal dizionario.Dopo la rimozione di un oggetto di blocco denominato da un dizionario, viene contrassegnato come eliminato e non può essere più addrefed.Un tentativo di bloccare lo stesso nome successivo comporta l'assegnazione di un nuovo oggetto denominato blocco che ha lo stesso nome e aggiunta un dizionario.Pertanto si desidera avere obsoleti denominato riferimenti a oggetti di blocco nella cache da un chiamante - riferimento non aggiornato verrà rilevato e aggiornata la prossima volta che si tenta di bloccare e allocare un nuovo oggetto di blocco.
Utilizziamo una funzionalità euristica ora semplice in base a pulire gli oggetti inutilizzati del blocco.In ogni n denominato chiamate di rilascio del blocco che viene controllato se vi è un'ora per eseguire la pulitura e quindi esaminare il dizionario e raccogliere tutti gli oggetti senza riferimenti non utilizzati di recente.Quindi si cerca di eliminare ogni oggetto e rimuovere il riferimento da un dizionario.Pulitura è per ogni partizione del dizionario, in modo che non è necessario bloccare altre partizioni quando eseguiamo una pulitura 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.