适当使用Monitor.Exit

时间:2010-11-03 16:19:15

标签: c# multithreading

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,而帖子1仍在//This point
  • 这会阻止MethodB被执行吗?如果是,是否有办法让MethodB执行。

我需要在执行MethodA之前释放MethodB(),因为我在发布MethodB之前不能等MethodA完成。另外,我无法在新主题中启动MethodB

2 个答案:

答案 0 :(得分:8)

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

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

要回答您的具体问题,此代码和原始代码都将执行MethodB,即使其他内容获取了锁定。

答案 1 :(得分:1)

因为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之前的答案将适合您。