我有一个应该以独占方式执行的方法。基本上,它是一个多线程应用程序,其中的方法由计时器定期调用,但也可以由用户操作手动触发。
举个例子:
定时器超时,所以方法是 叫。该任务可能需要几个 秒。
紧接着,用户点击了一些 按钮,它应该触发 相同的任务: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() 后半微秒按下了按钮。
将锁定对象设置为只读静态也很有意义。
关于c# - 如何在多线程上下文中使方法独占?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/148078/