2017-06-29 81 views
0

我疑难解答老的源代码,并遇到了如下语句:在try/catch语句C#Monitor.Exit

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: Object synchronization method was called from an unsynchronized block of code.

崩溃是否有一个安全的方式来拨打Monitor.Exit()在失败的条件和正常执行完成?

回答

6

只要在finally块中做到这一点,即使上面抛出异常,它也会始终运行。捕捉部分也是不必要的。

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

在这种情况下,“catch”块将覆盖可能在此处指定的异常详细信息。 – VMAtm