排他的な方法で実行する必要があるメソッドがあります。基本的に、これはメソッドがタイマーによって定期的に呼び出されるマルチスレッド アプリケーションですが、ユーザー アクションによって手動でトリガーすることもできます。
例を見てみましょう:
タイマーが経過したため、メソッドが呼び出されます。このタスクには数秒かかる場合があります。
直後に、ユーザーがいくつかのボタンをクリックすると、同じタスクがトリガーされます: BAM. メソッドはすでに実行されているため、何もしません。
私は次の解決策を使用しました:
public void DoRecurentJob()
{
if(!Monitor.TryEnter(this.lockObject))
{
return;
}
try
{
// Do work
}
finally
{
Monitor.Exit(this.lockObject);
}
}
lockObject
そのように宣言されている場所:
private readonly object lockObject = new object();
編集: このメソッドを保持するオブジェクトのインスタンスは 1 つしかないため、ロック オブジェクトを非静的になるように更新しました。
それを行うより良い方法はありますか?それとも、これは何らかの理由で間違っているのでしょうか?