2011-11-26 58 views

回答

1

如果你想使用lock,並能要知道當前是否僅使用一個語句/變量來獲取鎖,則可以嘗試使用以下類。他們不會因爲可讀性而獲得任何獎勵,但他們允許您使用using進行鎖定,只要您想要。

class DisposableLock 
{ 
    public bool IsAcquired { get; set; } 

    class Handle : IDisposable 
    { 
     private DisposableLock parent; 

     public void Dispose() 
     { 
      parent.IsAcquired = false; 
      Monitor.Exit(parent); 
     } 
    } 

    public IDisposable Acquire() 
    { 
     var handle = new Handle(); 
     handle.parent = this; 
     handle.parent.IsAcquired = true; 
     Monitor.Enter(this); 
     return handle; 
    } 
} 

用法:

DisposableLock lockForSomething = new DisposableLock(); 
// ... 

using (lockForSomething.Acquire()) 
{ 
// do something 
} 

然後可以使用lockForSomething.IsAcquired在其他一些地方,檢查是否正在使用的資源。內部類實施IDisposable是爲了確保您不會意外地使用using (lockForSomething)

4

lock()已經產生嘗試/終於在引擎蓋下阻擋所以就刪除它,一切都會好起來

+0

看起來像問題被改變,因爲最初沒有提到'與使用(lockForSomething)'但'與鎖(lockForSomething)'' – sll

0

此代碼:

using (lockForSomething) 
{ 
    // use it 
} 

暗示臨時當使用的代碼塊退出時,lockForSomething被處置。除非lockForSomething屬於更廣的範圍(不,不!),否則不同的線程無法訪問它。

0

即使發生異常,不會失敗,因爲:

lock (x) ... 

是一樣的:

System.Threading.Monitor.Enter(x); 
try { 
    ... 
} 
finally { 
    System.Threading.Monitor.Exit(x); 
} 

The lock statement on MSDN

相關問題