C#Monitor.Exit在Try/Catch中

Nic*_*eed 0 c# multithreading try-catch

我正在对旧的源代码进行故障排除,并且遇到了这样的声明:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

代码崩溃了 System.Threading.SynchronizationLockException: Object synchronization method was called from an unsynchronized block of code.

有没有一种安全的方法来调用Monitor.Exit()失败的条件和正常的执行完成?

ajg*_*ajg 7

只需在finally块中执行它,即使上面抛出异常,它也始终运行.捕获部分也是不必要的.

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