适当使用Monitor.Exit

Sim*_*One 4 c# multithreading

void MethodA()
{
   Monitor.Enter(this);
   if(someCondition)
   {
       Monitor.Exit(this);
       // This point
       MethodB();
    }
    else
    {
        // Set some values only
 Monitor.Exit(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有上面的方法可以在多线程中调用:

  • 假设线程1处于 //This point
  • Monitor.Enter当线程1仍在时,另一个线程进入//This point
  • 这会停止MethodB执行吗?如果是,是否有办法MethodB执行.

我需要MethodA在执行前释放,MethodB()因为我不能等到发布之前MethodB完成MethodA.另外,我无法MethodB在新线程中开始.

Dan*_*ant 8

抛开使用'this'作为锁的问题(不好的做法,因为它公开地暴露了锁),这个表单更干净,更安全(如果抛出异常则释放锁):

void MethodA()
{
   bool condition;
   lock(this)
   {
     condition = someCondition;
     if(!condition)
     {
        // Set some values only
     }
   }
   if (condition)
       MethodB();
}
Run Code Online (Sandbox Code Playgroud)

要回答您的具体问题,此代码和原始代码都将执行MethodB,即使其他东西获得了锁定.