望着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