如何使用完成与管理的资源?(How to use Finalize with managed res

2019-10-16 14:13发布

我对A类的一个实例如何被定义的存在,直到B类的最后一个实例被敲定后,并不清楚100%。

或者换句话说,我希望所有B的接近调用和处理方法, 一个B定稿里面,还有那些以A 之前发生自身完成。

场景:

答:我有一个非托管资源托管的包装。 对于一个比喻,让调用文件系统

B.管理是指一种资源,这反过来又要求通过一个包装的非托管资源。 对于analyogy,让我们称之为B中的文件。

额外的请求 - >我想用语法很好地发挥。 即调用使用处置明确不得处置非托管资源。 对象将生活在一个对象池。 它离开对象池时,才应配置。

class SomeClass() : IDisposable{

    public SomeClass(){}

    public ~SomeClass(){
       // dispose of unmanaged here?
    }

    // Dispose(bool disposing) executes in two distinct scenarios.
    // If disposing equals true, the method has been called directly
    // or indirectly by a user's code. Managed and unmanaged resources
    // can be disposed.
    // If disposing equals false, the method has been called by the
    // runtime from inside the finalizer and you should not reference
    // other objects. Only unmanaged resources can be disposed.
    public void Dispose(bool disposing) {
        if (disposing) {
            // dispose managed
        } else {
            // dispose unmanaged?
        }
    }

    public void Dispose() {
        Dispose(true);
        //GC.SuppressFinalize(this);
    }

}

参考文献:

[1] 为什么不允许重写Finalize方法

[2]通过C夏普第三版CLR。 CH。 21. CriticalFinalizerObject。 特别是第537的“使用与定稿资源管理”

Answer 1:

你无法控制一般定稿顺序。 您可以控制两相序,不过,使用CriticalFinalizerObject 。 也看的SafeHandle基础设施和的FileStream如何做到的。

如果这还不够,你可以任意创建从类的静态成员(如列表或字典)对象引用控制寿命。 只有当你释放那些引用定稿,可能会发生。 所以,你会创建与你清楚,一旦你发现一个的GCHandle到B已成为无效的参考。



文章来源: How to use Finalize with managed resources?