我有一个应该以独家方式执行的方法.基本上,它是一个多线程应用程序,其中方法由计时器定期调用,但也可以由用户操作手动触发.
我们来举个例子:
>计时器过去了,所以方法是
调用.任务可能需要一些
秒.
>之后,用户点击一些
按钮,应该触发
同样的任务: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();
编辑:只有一个对象的实例保存此方法,因此我将锁定对象更新为非静态.
有没有更好的方法呢?或者也许这个因为任何原因都是错的?
解决方法:
如果您只是对并行运行方法感兴趣,这看起来很合理.没有什么可以阻止它在彼此之后立即运行,比如在计时器执行Monitor.Exit()之后你按下按钮半微秒.
将锁定对象设置为只读静态也是有意义的.