在系统中,我们有通过特定参数锁定对象的方法。 作为实现,我们使用LockManager和Enter方法接收锁的密钥,检查锁对象是否存在于内部字典中,如果不存在,它会创建它并锁定。.NET多线程:锁定对象时锁定了很多时间的日志
我想要做的是为特定的锁定设置“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]);
}
}
}
现在我想添加一个额外的方法,可以说LockTimoutHandler(T键)将被调用,如果特定的键对象被锁定超过X时间。
为了做到这一点,我想为“Enter”和“Exit”方法添加一些逻辑。当输入一个称为,东西也会莫名其妙地被注册运行在X时间LockTimoutHandler,并在“退出”之称,是东西会以某种未注册。
我的问题是我可以用来代替东西?如何安排方法在X时间内运行,如果之前出现过,则请删除计划。它必须非常快速,因为在我们的情况下,性能非常重要。我知道Timer对象...它可以以延迟的方式执行方法,但它的性能足够好吗?我有什么额外的选择来实现呢?
注意:只是要清楚,我不是在谈论TryEnter。我不想在特定时间内无法锁定对象的情况下捕捉对象,我想捕获已锁定时间过长的对象。
谢谢!
您的输入法不是线程安全的。你可能会在不同的线程中同时阅读和写字典。这可能会导致您的应用程序发生死锁。 – pstrjds