代码之家  ›  专栏  ›  技术社区  ›  SimpleOne

适当使用监视器退出

  •  4
  • SimpleOne  · 技术社区  · 14 年前
    void MethodA()
    {
       Monitor.Enter(this);
       if(someCondition)
       {
           Monitor.Exit(this);
           // This point
           MethodB();
        }
        else
        {
            // Set some values only
     Monitor.Exit(this);
        }
    }
    

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

    • 假设线程1位于 //This point
    • 另一个线程进入 Monitor.Enter //这一点
    • 这会停止吗 MethodB 方法B 执行。

    我需要释放 MethodA MethodB() 因为我等不及了 方法B 释放前完成 方法 方法B 以新的思路。

    2 回复  |  直到 14 年前
        1
  •  1
  •   Frank Liao    14 年前

    因为someCondition不是作为参数传递的,所以我只能假设someCondition随时都可能更改(可能是类的实例变量)。所以,我会这样写代码:

    void MethodA()
    {
        if (someCondition)
        {
            bool conditionReached = false;
    
            Monitor.Enter(this);
            try
            {
                if (someCondition)
                {
                    conditionReached = true;
                }
            }
            finally
            {
                Monitor.Exit(this);
            }
    
            if (conditionReached)
            {
                MethodB();
            }
        }
    }
    

    如果没有,比之前的答案 condition

        2
  •  8
  •   Dan Bryant    14 年前

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

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