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) 断言特定锁由当前线程挂起 (调试断言)。
公共方法 AssertLockHeld(ILockName, LockManager.LockType, Int64) 断言特定锁由当前线程挂起 (调试断言)。
公共方法 AssertLockNotHeld(Object, LockManager.LockType, Int64) 断言特定未能锁定由当前线程挂起 (调试断言)。
公共方法 AssertLockNotHeld(ILockName, LockManager.LockType, Int64) 断言特定未能锁定由当前线程挂起 (调试断言)。
公共方法 AssertNoLocksHeld(Int64) 断言当前线程持有 LockManager 锁。
公共方法 AssertNoLocksHeld(LockManager.LockType, Int64) 断言特定未能锁定由当前线程挂起 (调试断言)。
公共方法 AssertZeroActiveLockObjects 断言其中 iff 是在锁定管理器的有效锁定 (其中 refcount > 0)
公共方法静态成员 CompareLockTypes 比较两个锁类型 (引发,如果锁类型不是可比的)。
公共方法 Equals 确定指定的对象是否等于当前对象。 (继承自 Object。)
受保护的方法 Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作。 (继承自 Object。)
公共方法 GetHashCode 作为默认哈希函数。 (继承自 Object。)
公共方法 GetLock(Object, LockManager.LockType, Int64) 获取锁。
公共方法 GetLock(ILockName, LockManager.LockType, Int64) 获取已命名的锁。
公共方法 GetType 获取当前实例的 Type。 (继承自 Object。)
公共方法 HasLocks 如果此 requestId 拥有任何锁,则返回 true。
公共方法 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 支持名为“锁定”概念,也就是说,我们必须锁定我们不可能会在内存中的稳定的对象的某个实体,但是,有这样的实体的名称。 示例是邮箱和数据库。 所有对象与邮箱或数据库可能是附带往往,有这样的实体的稳定是其名称的所有,例如一个数据库或邮箱数字的数据库 GUID 邮箱的。 我们支持监视器锁和读写器锁名为的锁定。

我们必须锁定内存时,的特定对象实例 LockManager 还支持泛型的“对象锁”。 只能监视器锁为对象锁,其中是当前支持是相同闭锁器 (在 C#“锁定”语句。 与“锁定”语句不同,LockManager 对象锁定完全参与一个锁定的层次结构,因此我们可以验证它们用于了正确的排序。

一个特例“对象锁”是“叶对象锁”。 我们不必为这些锁指定锁定级别-应始终是一最嵌套的锁,而其他锁不可接受,当保存此类叶锁时。

“名为锁”通过动态分配每个唯一名称的锁定对象并存储到实现在一个全局字典。 因此访问命名锁定名称需要字典中查找相应的锁定对象。 锁定对象字典如果自身将被锁定,当您执行此类外观。 所有这些元素的锁定使名为锁可能昂贵,由于锁定字典和字典查找的增加成本。 我们使用两种技术减少此类成本:(1) 分区锁定对象字典,减少字典全局锁争用和 (2) 大多数时候向调用方能够缓存名为锁定对象引用并跳过字典查找。 请注意单独的分区,不够用,因为它不相对有助于宽范围锁,例如数据库锁;例如,在中,当每个人若要访问同一共享锁。

具有唯一的锁名称的极大数量的。 因此,可以可能会创建名为锁定对象的数量也是无限制的。 由于对名为锁定对象的引用在一个全局字典存储,这些对象不能自动垃圾回收。 因此我们希望能够清理不经常使用的命名锁定对象。 若要支持命名锁定对象线程安全的清理,此类对象 refcounted。 在释放后,在一个名为锁定对象执行的每个锁需要这样的对象“addrefed”,引用应释放锁。 清理逻辑 tab 对象不会在移除它之前当前引用从字典。 在命名锁定对象从字典之后被取消,它被标记为已配置并不能 addrefed。 您应下时对锁的一个尝试将导致分配具有相同名称并将其添加到字典的新命名锁定对象。 因此可能有过时名为锁定对象引用缓存由调用方-将检测这些过时引用和更新,则下次我们尝试锁定并分配一个新锁定对象。

我们使用简单的时间基于试探法清理未使用的锁定对象。 在每个 N 名为锁释放上告诉我们 tab 键是否存在时运行清理,然后检查字典并收集最近未使用的所有未引用的对象。 然后我们尝试配置每一个这样的对象和从字典取消其引用。 清理是每个字典分区,因此,我们无需锁定其他分区,我们运行任何特定分区时清除。

线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。

请参阅

参考

Microsoft.TeamFoundation.Framework.Server 命名空间