2012-11-29 90 views
1

AFAIK,這兩個版本的lock之間有區別。Lock in Framework 3.5 vs 4.0?

框架4增加了一個檢查是否有監視器中的異常輸入(如內存溢出異常)

而且還有一個lockTaken標誌,它指示是否鎖定應被釋放(在finally子句)或不是(由於try子句中的失敗代碼)。

喜歡的東西

bool lockTaken = false; 
try 
{ 
    Monitor.Enter (lockObj, ref lockTaken); 
    ... 
} 
finally { if (lockTaken) Monitor.Exit (lockObj); } 

(非常類似於using代碼(配置...))

觀看由relfector我看到完全不同的東西:

[SecuritySafeCritical] 
public static void Enter(object obj, ref bool lockTaken) 
{ 
    if (lockTaken) 
    { 
     throw new ArgumentException(Environment.GetResourceString("Argument_MustBeFalse"), "lockTaken"); 
    } 
    ReliableEnter(obj, ref lockTaken); 
} 

哪裏是嘗試的模式,最後?

我錯過了什麼?

+1

在第一個片段,你正在尋找的方法調用,在第二在所謂的方法的實施。 – dtb

+1

@dtb這是c#4.0如何翻譯鎖定語句(編輯標題)。 –

回答

3

您應該看看使用lock語句而不是查看框架代碼的反編譯方法。所以,如果你嘗試編譯下面的方法:

object syncRoot = new object(); 
void Foo() 
{ 
    lock(syncRoot) {} 
} 

你會看到你所期待的:

void Foo() 
{ 
    bool lockTaken; 
    try 
    { 
    Monitor.Enter(syncRoot, out lockTaken); 
    } 
    finally 
    { 
    if (lockTaken) 
     Monitor.Exit(syncRoot); 
    } 
} 
+0

謝謝sergey。我不知道編譯器可以發送比FW代碼更多的代碼。 –