在系統中,我們有通過特定參數鎖定對象的方法。 作爲實現,我們使用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