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

    最佳答案

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

    关于c# - 适当使用Monitor.Exit,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4089163/

    10-10 13:40