如果终结器调用 Dispose(),您可以触发 "Disposing" 事件吗?
Can you fire a "Disposing" event if Dispose() is called by a Finalizer?
我注意到 MSDN (like this one) 上有一些 classes 有一个带有以下评论的 Disposing
事件:
Occurs when Dispose is called or when this object is finalized and collected by the garbage collector.
我想在我的 class 中实施我自己的 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 上的评论 link 我在顶部添加了,很明显有些对象在处理或完成时触发事件。
我是不是遗漏了什么或者这样安全吗? GraphicsDevice 如何实现在完成时从 dispose OR 触发的事件?如果答案只是 "No, you can't do this ever" 那么还有其他方法可以达到同样的效果吗? (处理对象的事件 或 已完成)
如果你打算在 Dispose
方法中做任何涉及其他对象的事情,你应该只在显式调用 Dispose
时这样做,而不是在从终结器调用时这样做。
这样做的原因是,如果其他对象也符合收集条件,则无法保证该对象尚未完成。
我注意到 MSDN (like this one) 上有一些 classes 有一个带有以下评论的 Disposing
事件:
Occurs when Dispose is called or when this object is finalized and collected by the garbage collector.
我想在我的 class 中实施我自己的 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 上的评论 link 我在顶部添加了,很明显有些对象在处理或完成时触发事件。
我是不是遗漏了什么或者这样安全吗? GraphicsDevice 如何实现在完成时从 dispose OR 触发的事件?如果答案只是 "No, you can't do this ever" 那么还有其他方法可以达到同样的效果吗? (处理对象的事件 或 已完成)
如果你打算在 Dispose
方法中做任何涉及其他对象的事情,你应该只在显式调用 Dispose
时这样做,而不是在从终结器调用时这样做。
这样做的原因是,如果其他对象也符合收集条件,则无法保证该对象尚未完成。