C#监视器。退出Try/Catch

C#监视器。退出Try/Catch,c#,multithreading,try-catch,C#,Multithreading,Try Catch,我正在对旧的源代码进行故障排除,遇到了如下语句: if (Monitor.TryEnter(lockObj)) { try { //does something if (failing_condition) { Monitor.Exit(lockObj); throw new Exception("Oops!"); } catch (Exception

我正在对旧的源代码进行故障排除,遇到了如下语句:

if (Monitor.TryEnter(lockObj))
{
    try
    {
        //does something
        if (failing_condition)
        {
            Monitor.Exit(lockObj);
            throw new Exception("Oops!");
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            Monitor.Exit(lockObj);
        }
    }
}
代码与
System.Threading.SynchronizationLockException一起崩溃:从未同步的代码块调用了对象同步方法。


是否有一种安全的方法可以在出现故障的情况下以及正常执行完成时调用Monitor.Exit()?

只需在finally块中执行,即使在上面抛出异常,它也会始终运行。此外,还不需要“捕捉”部分

 if(Monitor.TryEnter(lockObj)) {
  try {
    //does something
    if(failing_condition) {      
      throw new Exception("Oops!");
    }
  }
  finally {
    Monitor.Exit(lockObj);
  }
}

catch
在这种情况下,块将覆盖异常详细信息,这可以在这里使用。