Compartir a través de


LockManager (Clase)

Clase LockManager.

Jerarquía de herencia

System.Object
  Microsoft.TeamFoundation.Framework.Server.LockManager

Espacio de nombres:  Microsoft.TeamFoundation.Framework.Server
Ensamblado:  Microsoft.TeamFoundation.Framework.Server (en Microsoft.TeamFoundation.Framework.Server.dll)

Sintaxis

'Declaración
Public Class LockManager
public class LockManager

El tipo LockManager expone los siguientes miembros.

Constructores

  Nombre Descripción
Método público LockManager Constructor

Arriba

Métodos

  Nombre Descripción
Método público AssertLockHeld(Object, LockManager.LockType, Int64) Una aserción que se mantiene el bloqueo determinado por el subproceso actual (depuración assert).
Método público AssertLockHeld(ILockName, LockManager.LockType, Int64) Una aserción que se mantiene el bloqueo determinado por el subproceso actual (depuración assert).
Método público AssertLockNotHeld(Object, LockManager.LockType, Int64) Afirmar que no se mantiene el bloqueo determinado por el subproceso actual (depuración assert).
Método público AssertLockNotHeld(ILockName, LockManager.LockType, Int64) Afirmar que no se mantiene el bloqueo determinado por el subproceso actual (depuración assert).
Método público AssertNoLocksHeld(Int64) Afirmar que el subproceso actual no tiene bloqueos LockManager.
Método público AssertNoLocksHeld(LockManager.LockType, Int64) Afirmar que no se mantiene el bloqueo determinado por el subproceso actual (depuración assert).
Método público AssertZeroActiveLockObjects
Método públicoMiembro estático CompareLockTypes Compara dos bloquear tipos (throws si los tipos de bloqueo no son comparables).
Método público Equals Determina si el objeto especificado es igual al objeto actual. (Se hereda de Object).
Método protegido Finalize Permite que un objeto intente liberar recursos y realizar otras operaciones de limpieza antes de ser reclamado por la recolección de elementos no utilizados. (Se hereda de Object).
Método público GetHashCode Actúa como función hash para un tipo concreto. (Se hereda de Object).
Método público GetLock(Object, LockManager.LockType, Int64) Obtener un bloqueo.
Método público GetLock(ILockName, LockManager.LockType, Int64) Obtener un bloqueo con nombre.
Método público GetType Obtiene el objeto Type de la instancia actual. (Se hereda de Object).
Método público Lock(Object, Int64) Obtener un bloqueo de monitor de la hoja de un objeto dado.
Método público Lock(Object, LockManager.LockType, Int64) Obtener un bloqueo de monitor de objeto.
Método público Lock(ILockName, LockManager.LockType, Int64) Obtener un bloqueo con nombre.
Método protegido MemberwiseClone Crea una copia superficial del objeto Object actual. (Se hereda de Object).
Método público ReleaseAnyLock Liberar el bloqueo más anidado de un tipo de bloqueo determinado y cualquier nombre.
Método público ReleaseLock(Object, LockManager.LockType, Int64) Liberar un bloqueo.
Método público ReleaseLock(ILockName, LockManager.LockType, Int64) Liberar un bloqueo con nombre.
Método público TestLock(Object, LockManager.LockType, Int64) Prueba si este subproceso ya tiene un bloqueo.
Método público TestLock(String, LockManager.LockType, Int64) Prueba si este subproceso ya tiene un bloqueo.
Método público ToString Devuelve una cadena que representa el objeto actual. (Se hereda de Object).
Método público TryGetLock(Object, LockManager.LockType, Int64) Intente obtener un bloqueo.
Método público TryGetLock(ILockName, LockManager.LockType, Int64, Int32)

Arriba

Comentarios

Almacén administrado las prácticas de evitar el interbloqueo.Bloqueo de todos los debe utilizar los bloqueos de LockManager.Cada bloqueo tiene asignado un nivel (una posición en la jerarquía de bloqueo), y cualquier operación puede bloqueos de petición que son superiores en la jerarquía de cualquier bloqueo mantenido.

LockManager admite el concepto de "denominado bloqueos", e.g. cuando nos debemos bloquear alguna entidad para el que no tengamos un objeto estable en la memoria, pero tiene sólo un nombre de dicha entidad.Algunos ejemplos son buzones de correo y bases de datos.Cualquier objeto asociado con la base de datos o buzón puede ir y venir, todos tenemos estable para dicha entidad es su nombre, como un GUID de base de datos para un número de base de datos o buzón para un buzón.Se admiten los bloqueos de monitor y bloqueos de lector y escritor para los bloqueos con nombre.

LockManager también admite ordinarias objeto"bloqueos", cuando nos debemos bloquear una instancia de objeto determinado en la memoria.Sólo Monitor bloqueos actualmente son compatibles para los bloqueos de objeto, que es el mismo bloqueo mecanismo como se utiliza en la instrucción de C# "bloqueo".En contraste con la instrucción de "bloqueo", LockManager bloqueo del objeto participa plenamente en una jerarquía de bloqueo, por lo tanto, podemos comprobar que se utilizan en el orden correcto.

Un caso especial de "bloqueo del objeto" es un "bloqueo del objeto de hoja".No tenemos que especificar el nivel de bloqueo para tal bloqueo: se espera sea siempre un bloqueo más anidada y otros bloqueos no se pueden tomar cuando se mantiene tal bloqueo de la hoja.

"Bloqueos denominado" se implementa por dinámicamente asignando un objeto de bloqueo para cada nombre único y los almacena en un diccionario global.Por tanto, tener acceso a un bloqueo con nombre por nombre, se requiere buscar en diccionario para buscar un objeto de bloqueo correspondiente.El diccionario de objeto de bloqueo debe propio bloquearse mientras realiza esta búsqueda.Todo esto hace bloqueos con nombre potencialmente más costoso que los bloqueos normales, debido a los costes adicionales de bloqueo del diccionario y una búsqueda de diccionario.Utilizamos dos técnicas para reducir estos costes: (1) partición diccionario de objeto de bloqueo, para reducir la contención de bloqueo global de diccionario y (2) proporcionando llamador la capacidad para almacenar en caché la referencia de objeto de bloqueo con nombre y omitir la búsqueda de diccionario en la mayoría de los casos.Tenga en cuenta que solo de partición es insuficiente porque no sirve de mucho con bloqueos relativamente de todo el ámbito, como, por ejemplo, un bloqueo de la base de datos; Por ejemplo, cuando todo el mundo quiere tomar el mismo compartido bloqueo.

Hay un número potencialmente ilimitado de los nombres de bloqueo exclusivo.Por lo tanto, el número de objetos de bloqueo con nombre que potencialmente podemos crear también es ilimitado.Dado que las referencias a objetos de bloqueo con nombre se almacenan en un diccionario global, dichos objetos no pueden ser nunca recolecta automáticamente.Por lo tanto, deseamos poder limpiar objetos de bloqueo con nombre que no se utilizan con regularidad.Para admitir la limpieza de subprocesos de objetos de bloqueo con nombre, dichos objetos son refcounted.Cada bloqueo tomado en un objeto de bloqueo con nombre, es necesario tener tal objeto "addrefed", la referencia se debe liberar después de bloqueo se libera.Lógica de limpieza comprueba que el objeto no se hace referencia actualmente antes de quitar del diccionario.Después de quita un objeto de bloqueo con nombre de un diccionario, se marca como eliminado y no puede ser más addrefed.Un intento de bloquear el mismo nombre próxima vez hará que asignar un nuevo objeto de bloqueo con nombre que tiene el mismo nombre y agregarlo a un diccionario.Por lo tanto, es correcto tener obsoletos referencias de objeto de bloqueo en caché un llamador con nombre: dicha referencia obsoleto se detectarán y se actualiza la próxima vez que intente bloquearla y asignar un nuevo objeto de bloqueo.

Utilizamos un heurístico en función de tiempo simple para limpiar los objetos de bloqueo no utilizados.En cada n denominado las llamadas que compruebe si hay un tiempo para ejecutar Liberador de espacio y, a continuación, examine el diccionario y recopilar todos los objetos sin referencia que no se ha utilizado recientemente.A continuación, intentamos dispose de cada objeto y quitar su referencia de un diccionario.Liberador de espacio es por partición de diccionario, para que no es necesario bloquear otras particiones al ejecutar Liberador de espacio para una partición dada.

Seguridad para subprocesos

Todos los miembros static (Shared en Visual Basic) públicos de este tipo son seguros para la ejecución de subprocesos. No se garantiza que los miembros de instancias sean seguros para la ejecución de subprocesos.

Vea también

Referencia

Microsoft.TeamFoundation.Framework.Server (Espacio de nombres)