如果终结器调用 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 时这样做,而不是在从终结器调用时这样做。

这样做的原因是,如果其他对象也符合收集条件,则无法保证该对象尚未完成。