Classe LockManager
Classe de LockManager.
Hierarquia de herança
System.Object
Microsoft.TeamFoundation.Framework.Server.LockManager
Namespace: Microsoft.TeamFoundation.Framework.Server
Assembly: Microsoft.TeamFoundation.Framework.Server (em Microsoft.TeamFoundation.Framework.Server.dll)
Sintaxe
'Declaração
Public Class LockManager
public class LockManager
O tipo LockManager expõe os membros a seguir.
Construtores
Nome | Descrição | |
---|---|---|
LockManager | Construtor |
Superior
Métodos
Nome | Descrição | |
---|---|---|
AssertLockHeld(Object, LockManager.LockType, Int64) | Declarar que o bloqueio fornecido é mantido pelo segmento atual (a depuração afirma). | |
AssertLockHeld(ILockName, LockManager.LockType, Int64) | Declarar que o bloqueio fornecido é mantido pelo segmento atual (a depuração afirma). | |
AssertLockNotHeld(Object, LockManager.LockType, Int64) | Declarar que o bloqueio fornecido não é mantido pelo segmento atual (a depuração afirma). | |
AssertLockNotHeld(ILockName, LockManager.LockType, Int64) | Declarar que o bloqueio fornecido não é mantido pelo segmento atual (a depuração afirma). | |
AssertNoLocksHeld(Int64) | Declarar que o segmento atual não contém nenhum bloqueio de LockManager. | |
AssertNoLocksHeld(LockManager.LockType, Int64) | Declarar que o bloqueio fornecido não é mantido pelo segmento atual (a depuração afirma). | |
AssertZeroActiveLockObjects | Afirma o iff há bloqueios ativos no gerenciador de bloqueio (onde o refcount > 0) | |
CompareLockTypes | Compara dois tipos de bloqueio (gera se os tipos de bloqueios não são comparáveis). | |
Equals | Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object.) | |
Finalize | Permite que um objeto tente liberar recursos e executar outras operações de limpeza antes que seja recuperado pela coleta de lixo. (Herdado de Object.) | |
GetHashCode | Serve como a função de hash padrão. (Herdado de Object.) | |
GetLock(Object, LockManager.LockType, Int64) | Obter um bloqueio. | |
GetLock(ILockName, LockManager.LockType, Int64) | Obter um bloqueio chamado. | |
GetType | Obtém Type da instância atual. (Herdado de Object.) | |
HasLocks | Retorna true se este requestId possui qualquer bloqueio | |
Lock(Object, Int64) | Obter um bloqueio de monitor de folhas para um determinado objeto. | |
Lock(Object, LockManager.LockType, Int64) | Obter um bloqueio de monitor de objeto. | |
Lock(ILockName, LockManager.LockType, Int64) | Obter um bloqueio chamado. | |
MemberwiseClone | Cria uma cópia superficial de Objectatual. (Herdado de Object.) | |
ReleaseAnyLock | Liberar o bloqueio o aninhado mais de um determinado tipo de bloqueio e de qualquer nome. | |
ReleaseLock(Object, LockManager.LockType, Int64) | Liberar um bloqueio. | |
ReleaseLock(ILockName, LockManager.LockType, Int64) | Liberar um bloqueio chamado. | |
TestLock(Object, LockManager.LockType, Int64) | Teste se essa thread já contém um bloqueio. | |
TestLock(String, LockManager.LockType, Int64) | Teste se essa thread já contém um bloqueio. | |
ToString | Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object.) | |
TryGetLock(Object, LockManager.LockType, Int64) | Tente obter um bloqueio. | |
TryGetLock(ILockName, LockManager.LockType, Int64, Int32) | Obter um bloqueio chamado |
Superior
Comentários
Prevenção de deadlock gerenciado as práticas de Store. Qualquer bloqueio deve usar os bloqueios de LockManager. Cada bloqueio é atribuído um nível (uma posição na hierarquia de bloqueio), e qualquer operação só pode solicitar os bloqueios que são superiores na hierarquia do que qualquer bloqueio mantido no momento.
LockManager suporta o conceito de “chamado” bloqueios por exemplo, quando nós devemos bloquear qualquer entidade que nós podemos não ter um objeto estável na memória, mas tem apenas um nome de uma entidade. Exemplos são caixa postal e base de dados. Qualquer objeto associado com a caixa postal ou o base de dados pode vir e para ir, tudo o que temos o estábulo para uma entidade é seu nome, como um base de dados para um GUID base de dados ou um número de caixa postal para uma caixa postal. Nós suportamos bloqueios monitor e o leitor- gravador bloqueia para bloqueios nomeados.
LockManager também suporta “objeto comum bloqueia”, enquanto estamos devemos bloquear uma determinada instância de objeto na memória. Monitorar somente bloqueios são atualmente suportados para bloqueios de objeto, que é o mesmo mecanismo de bloqueio como usado na instrução “lock” do C#. Em contraste com a instrução “bloqueio”, o bloqueio de objeto de LockManager totalmente participa em uma hierarquia de bloqueio, portanto podemos verifica estiverem usados em uma ordem correta.
Uma caixa especial de “objeto de bloqueio” de “é um bloqueio do objeto folha”. Nós não tem que especificar o bloqueio em nível para tal bloqueio - espera-se sempre ser um bloqueio mais aninhado e nenhum outro bloqueio pode ter cuidado para armazenar tal bloqueio de folha.
“Chamado bloqueios” são implementados cedendo dinamicamente um objeto de bloqueio para cada nome exclusivo, e armazenar os em um dicionário global. Para acessar um bloqueio chamado requer por nome a pesquisa de dicionário localizar um objeto correspondente de bloqueio. O dicionário se o próprio objeto de bloqueio é bloqueado quando você executar uma pesquisa. Qualquer isso torna bloqueios nomeados possivelmente mais caros de bloqueios comuns, devido a custo adicional de bloquear o dicionário e uma pesquisa de dicionário. Usamos duas técnicas reduzir como custo: (1) dividindo o dicionário de objeto de bloqueio, para reduzir a conflito de bloqueio global de dicionário, e (2) fornecendo o chamador a capacidade de armazenar em cachê a referência chamado de objeto de bloqueio e de ignorar na maioria das vezes na pesquisa de dicionário. Observe que dividir apenas insuficientes porque não ajuda muito com relativamente os bloqueios de largo- escopo, como um bloqueio de base de dados; por exemplo, quando todos desejar agarrar o mesmo bloqueio compartilhado.
Há um número potencial ilimitado de nomes exclusivos de bloqueio. Portanto, o número de objetos que nomeados de bloqueio podemos potencialmente criar também é ilimitado. Porque as referências a objetos chamados de bloqueio são armazenadas em um dicionário global, esses objetos podem nunca automaticamente lixo- ser coletados. Portanto queremos possível limpar os objetos chamados de bloqueio que não são usados regularmente. Para oferecer suporte a limpeza de segmento seguro de objetos chamados de bloqueio, esses objetos refcounted. Cada bloqueio executada em um objeto chamado de bloqueio requer ter uma objeto “addrefed”, a referência deve ser lançado após o bloqueio será liberado. Verificações de lógica de limpeza que o objeto referenciado não está atualmente antes de remover de dicionário. Depois que um objeto chamado de bloqueio é removido um dicionário, é marcado como descartados e não pode ser addrefed mais. Uma tentativa de bloquear o mesmo nomeia as próximas vezes que alocar de um novo objeto chamado de bloqueio que tem o mesmo nome e adicioná-lo de volta a um dicionário. Isso é APROVADA ter referências nomeados obsoletos de objeto de bloqueio armazenadas em cachê por um chamador - tal referência obsoleto será detectada e atualizada a próxima vez que tenta-se para bloquear e atribuir um novo objeto de bloqueio.
Usamos tempo um simples heurístico base para limpar objetos não usado de bloqueio. Em cada versão chamada de bloqueio Em chama-nos verifique se houver uma hora de executar limpeza, e então examinar o dicionário e coletam todos os objetos sem referência que não são utilizados mais recentemente. Em tenta-se descartar cada tal objeto e remover a referência de um dicionário. Limpeza é por partição do dicionário, de modo que nós não tenhamos que bloquear outros partições quando nós executamos limpeza para qualquer partição determinado.
Acesso thread-safe
Quaisquer membros estático (Shared no Visual Basic) públicos deste tipo são thread-safe. Não há garantia de que qualquer membro de instância seja thread-safe.