2017-06-29 75 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