我有一个应该以排他方式执行的方法。基本上,它是一个多线程应用程序,其中方法由计时器定期调用,但也可以由用户操作手动触发。
让我们举个例子:
计时器到时,因此调用该方法。该任务可能需要几秒钟。
紧接着,用户点击了某个按钮,这应该会触发相同的任务: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();
编辑:只有一个对象实例包含此方法,因此我将锁定对象更新为非静态。
有更好的方法吗?或者也许这个只是出于某种原因是错误的?