2012-09-13 72 views
0

我從事的一個項目是通過商業分析工具進行分析的。它將我們的ReaderWriterLockSlim實現標記爲潛在的內存泄漏源,因爲我們沒有調用Dispose()方法。應該在ReaderWriterLockSlim鎖上調用Dispose()嗎?

我從來沒有見過這種方法調用這個鎖:無論是在我工作的代碼或我從中學習的代碼示例。 Dispose()應該被調用嗎?如果在線程仍然需要時處理它會怎樣?這可能嗎?

這裏是我們目前如何使用它的樣本 - 無Dispose()方法:

Public Class Test 
    { 

    private ReaderWriterLockSlim _lookupLock = new ReaderWriterLockSlim(); 

      public IDictionary<int, SomeObject> GetAll() 
      { 
       _lookupLock.EnterWriteLock(); 
       try 
       { 
        if (X == null || X.Count == 0) 
        { 
         Do Something...; 
        } 
       } 
       finally 
       { 
        _lookupLock.ExitWriteLock(); 
       } 

       return Something...; 
      } 
} 
+2

當然,它有一個Dispose()方法,這樣工具就會發出抱怨。你必須權衡的是你實際調用Dispose()的成本。這是非常高的一個,你*有*確保使用RWLS的所有*線程已經退出。這可能很難實現。簡單的方法是把它留給垃圾收集器,它永遠不會錯。 –

回答

2

它需要處理。

大多數情況下,ReaderWriterLockSlim用於保護靜態資源,因此將是一個不需要處置的靜態實例。

但在你的情況下(每個實例一個ReaderWriterLockSlim),你需要使你的類IDisposable,並處置ReaderWriterLockSlim

或者更好的選擇是使用普通鎖(即Monitor)來保護實例資源而不是ReaderWriterLockSlim。可能沒有太多性能差異,它使您的代碼更簡單,並且避免了您需要讓您的類IDisposable。

框架類如ConcurrentDictionary使用普通鎖。

+0

我用它來保護一個靜態資源(S),並有每個類的鎖的一個實例(我更新了我的問題,以反映這一點)。由於線程依賴於鎖,是否有任何處置鎖的風險? –

+0

如果你正在保護一個靜態資源,當然_lookupLock字段必須是靜態的,在這種情況下你不需要處理它。 – Joe

0

在你的班上嘗試自IDisposable到繼承看這個類的聲明作爲一個例子

改變你的聲明這當然,並添加您現有的代碼的其餘部分..!

Public Class Test : IDisposable 
{ 

} 

我怎麼會聲明它,例如下面

public class WriteLock : IDisposable 
{ 
    ReaderWriterLockSlim _rwlock; 
    public WriteLock(ReaderWriterLockSlim rwlock) 
    { 
     _rwlock = rwlock; 
     _rwlock.EnterWriteLock(); 
    } 
    public void Dispose() 
    { 
     _rwlock.ExitWriteLock(); 
    } 

}

+0

類聲明是標準的:Public Class Something {}。它的方法利用像我發佈的鎖。 –

+0

然後,您需要添加:IDisposable就像示例我已經顯示你有一個私人方法不是一個類..顯示類聲明請 – MethodMan

+0

我更新了我的答案,以顯示類。我不想用包裝類來管理它。只是想知道在鎖上調用Dispose()是否需要完成。 –

相關問題