システムには、特定のパラメータによってオブジェクトをロックするメソッドがあります。実装として、ロックのキーを受け取り、ロックオブジェクトが内部ディクショナリに存在するかどうかを確認する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キー)を追加します。
それを行うために、「Enter」メソッドと「Exit」メソッドにロジックを追加したいと思います。Enterが呼び出されると、X時間でLockTimoutHandlerを実行するために何かが登録され、 "Exit"が呼び出されると、その何かが何らかの形で登録解除されます。
私の質問は、その代わりに何を使用できるかということです。X時間で実行するようにメソッドをスケジュールする方法と、Exitが以前に発生した場合は、スケジュールを削除します。私たちの場合、パフォーマンスが非常に重要であるため、非常に高速である必要があります。Timerオブジェクトについて知っています...メソッドを遅延して実行できますが、パフォーマンスは十分ですか?それを達成するために必要な追加のオプションは何ですか?
注:明確にするために、私はTryEnterについて話していません。オブジェクトを特定の時間ロックできない場合をキャッチしようとはしていません。すでにロックされているオブジェクトをキャッチしたいのです。
ありがとう!