Поделиться через


LockManager - класс

Класс LockManager.

Иерархия наследования

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

Пространство имен:  Microsoft.TeamFoundation.Framework.Server
Сборка:  Microsoft.TeamFoundation.Framework.Server (в Microsoft.TeamFoundation.Framework.Server.dll)

Синтаксис

'Декларация
Public Class LockManager
public class LockManager

Тип LockManager предоставляет следующие члены.

Конструкторы

  Имя Описание
Открытый метод LockManager Конструктор

В начало страницы

Методы

  Имя Описание
Открытый метод AssertLockHeld(Object, LockManager.LockType, Int64) Утверждение, что данной блокировки текущим потоком (debug assert).
Открытый метод AssertLockHeld(ILockName, LockManager.LockType, Int64) Утверждение, что данной блокировки текущим потоком (debug assert).
Открытый метод AssertLockNotHeld(Object, LockManager.LockType, Int64) Утверждать, что данный не блокировки текущим потоком (debug assert).
Открытый метод AssertLockNotHeld(ILockName, LockManager.LockType, Int64) Утверждать, что данный не блокировки текущим потоком (debug assert).
Открытый метод AssertNoLocksHeld(Int64) Утверждение, что текущий поток владеет блокировки не LockManager.
Открытый метод AssertNoLocksHeld(LockManager.LockType, Int64) Утверждать, что данный не блокировки текущим потоком (debug assert).
Открытый метод AssertZeroActiveLockObjects
Открытый методСтатический член CompareLockTypes Сравнивает две блокировки типов (создает исключение, если типы блокировки не являются сопоставимыми).
Открытый метод Equals Определяет, равен ли заданный объект текущему объекту. (Унаследовано от Object.)
Защищенный метод Finalize Позволяет объекту попытаться освободить ресурсы и выполнить другие операции очистки, перед тем как объект будет утилизирован в процессе сборки мусора. (Унаследовано от Object.)
Открытый метод GetHashCode Играет роль хэш-функции для определенного типа. (Унаследовано от Object.)
Открытый метод GetLock(Object, LockManager.LockType, Int64) Получите блокировку.
Открытый метод GetLock(ILockName, LockManager.LockType, Int64) Получение именованного блокировки.
Открытый метод GetType Возвращает объект Type для текущего экземпляра. (Унаследовано от Object.)
Открытый метод Lock(Object, Int64) Получите блокировку монитора конечного для данного объекта.
Открытый метод Lock(Object, LockManager.LockType, Int64) Получите блокировку объекта монитора.
Открытый метод Lock(ILockName, LockManager.LockType, Int64) Получение именованного блокировки.
Защищенный метод MemberwiseClone Создает неполную копию текущего объекта Object. (Унаследовано от Object.)
Открытый метод ReleaseAnyLock Выпуск самого нижнего уровня блокировки типа блокировки и любое имя.
Открытый метод ReleaseLock(Object, LockManager.LockType, Int64) Снять блокировку.
Открытый метод ReleaseLock(ILockName, LockManager.LockType, Int64) Снять блокировку с именем.
Открытый метод TestLock(Object, LockManager.LockType, Int64) Тест, если этот поток уже владеет блокировкой.
Открытый метод TestLock(String, LockManager.LockType, Int64) Тест, если этот поток уже владеет блокировкой.
Открытый метод ToString Возвращает строку, представляющую текущий объект. (Унаследовано от Object.)
Открытый метод TryGetLock(Object, LockManager.LockType, Int64) Попытка получить блокировку.
Открытый метод TryGetLock(ILockName, LockManager.LockType, Int64, Int32)

В начало страницы

Заметки

Управляемые хранилища и рекомендации избегание взаимоблокировок.Все блокировки необходимо использовать блокировки LockManager.Все блокировки назначен уровень (положение в иерархии блокировок) и любой операции можно только запросить блокировки, которые находятся в иерархии выше в данный момент удерживаются блокировки.

LockManager поддерживает концепцию «с именем блокировки» e.g. когда мы должны блокировать некоторые сущности, для которой мы может не иметь стабильные объекта в памяти, но имеют имя такого объекта.Примерами таких почтовых ящиков и баз данных.Любой объект, связанный с почтового ящика или базы данных могут поступать и переход, у всех нас стабильность для такого объекта является его имя, например, идентификатор GUID базы данных для базы данных или почтового ящика номер для почтового ящика.Мы поддерживаем монитор блокировок и блокировки чтения и записи с именем блокировок.

LockManager поддерживает обычные «объект блокировки», когда необходимо заблокировать экземпляр определенного объекта в памяти.Только монитор блокировок в настоящее время поддерживаются для блокировки объектов, такой же блокировки механизм, используемый в инструкции C# "lock".В отличие от оператора «lock» LockManager блокировку объекта полностью участвует в иерархии блокировок таким образом мы может убедитесь, что они используются в правильном порядке.

Один особый случай «блокировка объекта» является «lock конечного объекта».Не нужно указывать уровень блокировки такие блокировки - должен быть всегда блокировать большинство вложенных и другие блокировки не может выполняться, когда удерживает блокировку таких конечных.

«С именем блокировок» реализуются динамически выделяет объект блокировки для каждого уникального имени и хранение их в глобальный словаря.Таким образом доступ к именованным блокировки по имени требует словарь поиска для поиска соответствующего объекта блокировки.Блокировки словарь объектов должен сам заблокирован при выполнении такого поиска.Все это делает потенциально дороже, чем обычные блокировки именованных блокировки из-за дополнительных затрат на блокировку словарь и словарь поиска.Мы используем две технологии для уменьшения стоимости таких: (1) секционирование словарь объектов блокировки, чтобы снизить конкуренцию глобальная блокировка словарь и (2) предоставления вызывающему объекту возможность кэшировать ссылку на объект именованного блокировки и пропустить просмотр словаря в большинстве случаев.Обратите внимание, что разделение само по себе недостаточно, так как не помогает много блокировок относительно всей области, такие как блокировка базы данных; Например, когда желают взять же общие блокировки.

Потенциально неограниченное количество имен уникальный блокировки.Таким образом количество именованных блокировку объектов, которые потенциально можно создать также является неограниченным.Поскольку ссылки на именованные Блокировка объектов хранятся в глобальном словарь, такие объекты никогда не может быть автоматически сборщиком мусора.Поэтому мы хотим для очистки именованных блокировку объектов, которые не используются регулярно.Для поддержки поточно-Очистка блокировки именованных объектов, такие объекты являются refcounted.Каждый блокировку, выполненную на объект с именем блокировки требует наличия такого объекта «addrefed», следует освободить ссылку, после снятия блокировки.Логику очистки проверяет, что объект в данный момент нет ссылок перед ее удалением из словаря.После удаления блокировки с именем объекта из словаря отмечена, как и не может быть более addrefed.При попытке заблокировать очередной тем же именем приведет к выделение объекта именованного блокировки с тем же именем и добавление его в словарь.Таким образом она является ОК устаревшие с именем ссылки на объект блокировки, вызывающий объект в кэше - такие устаревшие ссылки будет обнаружена и обновлена в следующий раз мы попытаться заблокировать ее и разместить новый объект блокировки.

Мы используем время простой эвристики для освобождения неиспользуемого Блокировка объектов.На каждые n с именем вызовы освобождения блокировки, проверяется, если время выполнения очистки и затем проверить словарь и собрать все неиспользуемые объекты, которые не обращались.Затем выполняется попытка удаления каждого такого объекта и удалить ссылку из словаря.Очистки, на секцию словарь, поэтому не нужно блокировать другие секции при выполнении очистки для любого заданного раздела.

Потокобезопасность

Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантируется.

См. также

Ссылки

Microsoft.TeamFoundation.Framework.Server - пространство имен