我有一個類MyClass
。這個類有一個字段:public ReaderWriterLockSlim rw;
(更簡單的示例代碼公開)。許多線程可以使用rw.EnterReadLock
等IDisposable和ReaderWriterLockSlim
而且我已經實現IDisposable
接口讀取MyClass
數據:
private void Dispose (bool pDisposing)
{
{
if (pDisposing) // release managed resources
{
if (rw != null)
{
rwLockSlim.Dispose();
rwLockSlim = null;
}
}
//--- release unmanaged resources
// some code...
isDisposed = true; // ...
}
}
就像你看到的,當一個線程使用MyClass
問題是,當MyClass的對象上第二個線程調用Dispose
。我不能配置ReaderWriterLockSlim,因爲它會使我的應用程序崩潰。那麼我應該刪除那些釋放託管資源的行?無論如何,ReaderWriterLockSlim將在不久的將來由GC收集,對吧? (但這類資源昂貴嗎?)。
也許我應該在Dispose metod中添加一些鎖(syncObject)或其他東西?
編輯:我也處理AllocHGlobal,所以我需要等待,直到所有線程將停止讀取/寫入到myClass
。
不同的觀點:
public MyClass : IDisposable
{
public void EnterReadLock(); // calls rwLockSlim.EnterReadLock,
// if object is disposed throws Exception
public void ExitReadLock(); // same as above
public void Dispose(); // wait until all threads exit from locks,
// frees unamanged resources, mark class as disposed
}
公衆ReaderWriterLockSlim僅用於示例目的。就像你在第二個例子中看到的,我做了一個方法EnterReadLock(),它調用了rwLockSlim.EnterReadLock()。無論如何感謝您的答案中的所有建議。 – zgnilec
我也會盡量避免這樣的構造。從我可以告訴它看起來像你在多個線程中使用'MyClass'類的單個實例,這很好。但是,如果你這樣做,然後使方法線程安全,不要依賴其他代碼正確執行'EnterReadLock'和'ExitReadLock'。 – Dirk
在某些情況下,我們希望在調用Dispose之前等待線程完成,但是有一些阻塞API(用於通信等),其中Dispose是可以在對象上調用的* only *方法正在等待某些事情發生(在某些硬件設備上,一旦請求了操作,如果不將設備置於無法使用的狀態,直到設備重新配置),則無法取消該設備。在這種模式下,對繁忙的對象調用「Dispose」會導致正在進行的操作拋出異常。 – supercat