在系统中,我们有通过特定参数锁定对象的方法。
作为实现,我们有带有 Enter 方法的 LockManager,该方法接收锁的密钥,检查内部字典中是否存在锁对象,如果不存在,则创建它然后锁定。
我想要做的是为特定锁定设置“X 预期时间”,如果一个对象被锁定超过 X 时间,我想向我们的日志写入一条消息。
下面是我的锁管理器的源代码:
public class MyLockManager<T>
{
protected Dictionary<T, object> LockDictionary { get; private set; }
public MyLockManager()
{
LockDictionary = new Dictionary<T, object>();
}
/// <summary>
/// Enters a lock on the key.
/// </summary>
/// <param name="key">The key to lock.</param>
public virtual void Enter(T key)
{
if (!LockDictionary.ContainsKey(key))
{
lock (LockDictionary)
{
if (!LockDictionary.ContainsKey(key))
{
LockDictionary.Add(key, new object());
}
}
}
object lockObj = LockDictionary[key];
Monitor.Enter(lockObj);
}
/// <summary>
/// Releases the lock on the key.
/// </summary>
/// <param name="key">The key to release.</param>
public virtual void Exit(T key)
{
if (LockDictionary.ContainsKey(key))
{
Monitor.Exit(LockDictionary[key]);
}
}
}
现在我想添加一个额外的方法,假设特定键的对象被锁定超过 X 时间,将调用 LockTimoutHandler(T key) 。
为了做到这一点,我想向“Enter”和“Exit”方法添加一些逻辑。当 Enter 被调用时,某些东西会以某种方式被注册在 X 时间内运行 LockTimoutHandler,当调用“Exit”时,有些东西会以某种方式被取消注册.
我的问题是我可以用什么来代替某物?我如何安排该方法在 X 时间内运行,如果之前发生退出,则删除该计划。它必须非常快,因为在我们的例子中性能非常重要。我知道 Timer 对象......它可以以延迟的方式执行方法,但它的性能足够好吗?为了实现这一目标,我还需要哪些额外的选择?
NOTE: 澄清一下,我不是在谈论TryEnter。我并不是想捕获对象无法锁定特定时间的情况,我想捕获已经锁定时间过长的对象。
Thanks!
我们也有类似的需求,是这样解决的:
- 锁定时,将计时器设置为超时,并向其传递一个状态对象,其中包含您想要的密钥和委托:日志记录、强制解锁……您的用例所需的任何内容
- 当计时器触发时,检查密钥,如果条目存在则调用委托
-
重要的:回收计时器(例如在线程安全队列中),执行not让它超出范围。
- 当您下次需要计时器时,从回收队列中取出一个计时器并操作状态对象 - 仅在需要时创建一个新计时器。
这将根据需要保留尽可能多的计时器,但不会更多,并且只会产生一次分配/释放的成本。由于您无法更改计时器的状态对象,因此您需要更改其内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)