我想知道有没有更好的方法来实现这个"简单的锁定"

Aid*_*anO 2 c# locking nonblocking

有没有更好的方法来实现像下面这样的简单锁定?

如果它还没有被运行,我只想要"DOSOMETHING".我应该在这里使用reall锁吗?如果我使用锁定会导致一切排队并等待锁定释放?(那不是我想要的!)

谢谢

  bool running = false;

  void DataDisplayView_Paint(object sender, PaintEventArgs e)
  {
    // if (!this.initialSetDone)  
     if (!running)
     {
        this.running = true;

        //DOSOMETHING

        this.running = false;
     }
 }
Run Code Online (Sandbox Code Playgroud)

Bri*_*eon 5

不,你不想在这里使用锁.这不是线程同步问题.这是一种方法重入问题.

你可能会尝试这样的事情.

bool running = false; 

void DataDisplayView_Paint(object sender, PaintEventArgs e) 
{ 
  if (!this.running)
  {
    this.running = true; 
    try
    {
      //DOSOMETHING 
    }
    finally
    {
      this.running = false; 
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Grzenio:是的,但问题从未表明涉及的多个线程和相关方法的签名似乎证实了这一点.这不过是在单个线程上执行的`Control.Paint`事件...... UI线程.鉴于我认为OP更安全地假设OP正在描述重入问题而不是线程同步问题. (2认同)
  • @Dmitry:还有另一种方法:**递归**(我并不是指显式调用`DataDisplayView_Paint`,而是调用有问题的控件上的某些方法再次引发`Paint`事件,触发此代码为第2个,第3,第4等时间). (2认同)