我注意到有MSDN上有一個Disposing
事件有以下評論(like this one)一些類:如果Dispose()被Finalizer調用,您能否觸發「Disposing」事件?
時發生調用Dispose或當該對象被定稿,並通過垃圾收集器收集。
我想在我的一個類中實現我自己的Disposing
事件。這是我的基本實現(following the best practices for the dispose pattern):在我的代碼審查
public abstract class Handle : IDisposable
{
public bool Disposed { get; private set; }
public event System.Action DisposingCompleted;
public Handle()
{
Disposed = false;
}
~Handle()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing = false)
{
if (Disposed)
{
return;
}
if (disposing)
{
HandleManagedResources();
}
HandleUnManagedResources();
Disposed = true;
if (DisposingCompleted != null)
{
DisposingCompleted();
}
}
protected virtual void HandleManagedResources() {}
protected virtual void HandleUnManagedResources() {}
}
有人提到,他們不知道應該像這樣的事件是否射擊是安全的,因爲Dispose()
可能會從終結調用,但是,根據對於我在頂部添加的MSDN鏈接的評論,很明顯,有些對象會在事件處置或定稿時觸發事件。
我錯過了什麼,或者這是安全的嗎? GraphicsDevice如何實現從處置或最終確定時觸發的事件?如果答案只是「不,你不能做到這一點」,那麼是否有其他方式達到相同的效果? (用於物體的事件被設置OR定稿)
您應該使用標準的建議實現和模式,如命名和約定,而不是自己滾動。特別是,你應該使用'bool disposing'而不是'fromFinalizer'。 –
@ LasseV.Karlsen當然,我改變了名字。 – Foggzie
您可能想要閱讀Eric Lipperts的文章,瞭解可在定稿器中發生的所有奇怪現象http://ericlippert.com/2015/05/18/when-everything-you-know-is-wrong-part-one/ – juharr