望着IDisposable模式+終結模式,有件事我不明白:IDisposable接口+終結模式
public class ComplexCleanupBase : IDisposable
{
private bool disposed = false; // to detect redundant calls
public ComplexCleanupBase()
{
// allocate resources
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
if (disposing)
{
// dispose-only, i.e. non-finalizable logic
}
// shared cleanup logic
disposed = true;
}
}
~ComplexCleanupBase()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
}
從我的理解的模式應該像上面實現。
1)調用Dispose()觸發GC.SuppressFinalize(this),這意味着該對象不應該放在終結器隊列上,因爲它已經正確處理了?這有助於更快地釋放對象?
2)但是如果我根本就不在這個對象上調用Dispose()怎麼辦?在這種情況下,終結者應該踢進,對嗎?但是Dispose(false);完全沒有(只設置處置=真)。這是打算?感覺好像有什麼東西丟失......
終結器不應該阻止獲取鎖,即使鎖預計不會持續很長時間。如果某些事情導致鎖定不當,可能會阻止任何其他終結器運行。 – supercat 2014-01-20 00:40:38
@supercat在這種情況下,呼叫在終結者中不可能被阻止。 '_mutex'只能用於處理目的。一般來說,你是正確的,但在這種情況下,你的觀點(應該是)是沒有意義的。 – 2014-01-20 10:12:20
@supercat只是想到了一種情況,使我以前的評論不正確:如果在另一個實例的終結過程中,它會將ComplexCleanupBase的實例恢復生命,以便它在應用程序中具有另一個根,那麼可能會在互斥體上爭用,儘管這應該*真的*不會完成。答案更新完全一樣。 – 2014-01-20 12:58:30