Compartilhar via


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
Método público LockManager Construtor

Superior

Métodos

  Nome Descrição
Método público AssertLockHeld(Object, LockManager.LockType, Int64) Declarar que o bloqueio fornecido é mantido pelo segmento atual (a depuração afirma).
Método público AssertLockHeld(ILockName, LockManager.LockType, Int64) Declarar que o bloqueio fornecido é mantido pelo segmento atual (a depuração afirma).
Método público AssertLockNotHeld(Object, LockManager.LockType, Int64) Declarar que o bloqueio fornecido não é mantido pelo segmento atual (a depuração afirma).
Método público AssertLockNotHeld(ILockName, LockManager.LockType, Int64) Declarar que o bloqueio fornecido não é mantido pelo segmento atual (a depuração afirma).
Método público AssertNoLocksHeld(Int64) Declarar que o segmento atual não contém nenhum bloqueio de LockManager.
Método público AssertNoLocksHeld(LockManager.LockType, Int64) Declarar que o bloqueio fornecido não é mantido pelo segmento atual (a depuração afirma).
Método público AssertZeroActiveLockObjects Afirma o iff há bloqueios ativos no gerenciador de bloqueio (onde o refcount > 0)
Método públicoMembro estático CompareLockTypes Compara dois tipos de bloqueio (gera se os tipos de bloqueios não são comparáveis).
Método público Equals Determina se o objeto especificado é igual ao objeto atual. (Herdado de Object.)
Método protegido 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.)
Método público GetHashCode Serve como a função de hash padrão. (Herdado de Object.)
Método público GetLock(Object, LockManager.LockType, Int64) Obter um bloqueio.
Método público GetLock(ILockName, LockManager.LockType, Int64) Obter um bloqueio chamado.
Método público GetType Obtém Type da instância atual. (Herdado de Object.)
Método público HasLocks Retorna true se este requestId possui qualquer bloqueio
Método público Lock(Object, Int64) Obter um bloqueio de monitor de folhas para um determinado objeto.
Método público Lock(Object, LockManager.LockType, Int64) Obter um bloqueio de monitor de objeto.
Método público Lock(ILockName, LockManager.LockType, Int64) Obter um bloqueio chamado.
Método protegido MemberwiseClone Cria uma cópia superficial de Objectatual. (Herdado de Object.)
Método público ReleaseAnyLock Liberar o bloqueio o aninhado mais de um determinado tipo de bloqueio e de qualquer nome.
Método público ReleaseLock(Object, LockManager.LockType, Int64) Liberar um bloqueio.
Método público ReleaseLock(ILockName, LockManager.LockType, Int64) Liberar um bloqueio chamado.
Método público TestLock(Object, LockManager.LockType, Int64) Teste se essa thread já contém um bloqueio.
Método público TestLock(String, LockManager.LockType, Int64) Teste se essa thread já contém um bloqueio.
Método público ToString Retorna uma cadeia de caracteres que representa o objeto atual. (Herdado de Object.)
Método público TryGetLock(Object, LockManager.LockType, Int64) Tente obter um bloqueio.
Método público 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.

Consulte também

Referência

Namespace Microsoft.TeamFoundation.Framework.Server