c# - IAsyncDisposable 有引用实现吗?

标签 c# .net .net-core idisposable

IDisposable ,我经常使用抽象基类,因为实现它非常困难。主要是因为您可以使用该接口(interface)来处理托管和非托管引用,并且每个引用的处理方式都不同。

public abstract class Disposable : IDisposable
{
    ~Disposable() => this.Dispose(false);

    public bool IsDisposed { get; private set; }

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

    protected virtual void DisposeManaged() {}
    protected virtual void DisposeUnmanaged() {}

    protected void ThrowIfDisposed()
    {
        if (this.IsDisposed)
        {
            throw new ObjectDisposedException(this.GetType().Name);
        }
    }

    private void Dispose(bool disposing)
    {
        if (!this.IsDisposed)
        {
            if (disposing)
            {
                this.DisposeManaged();
            }

            this.DisposeUnmanaged();
            this.IsDisposed = true;
        }
    }
}

IAsyncDisposable ,我找不到引用实现。另外,我相信它只处理托管资源,主要是因为它太新了,并且没有需要处理异步的非托管资源。它是否正确?如果是这样,那么实现是否微不足道?

最佳答案

我们为框架决定的模式,将在 Framework Design Guidelines, 3rd Edition 中发布是:

public async ValueTask DisposeAsync()
{
    await DisposeAsyncCore().ConfigureAwait(false);
    Dispose(false);
    GC.SuppressFinalize(this);
}

protected virtual ValueTask DisposeAsyncCore()
{
    // Code goes here that is the async equivalent to Dispose(true)
}

当然,这确实意味着所有 IAsyncDisposable类型也是 IDisposable .另外,sealed类型可以跳过DisposeAsyncCore() .

关于c# - IAsyncDisposable 有引用实现吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58112716/

相关文章:

c# - 无法引用引用程序集中的对象

c# - IoC比较

.net - 如何将命令行参数传递给 ClickOnce 应用程序?

c# - 捕获 C# .NET 中的所有崩溃

c# - Entity Framework : Passing String Parameter to FromSql Statement in Version 2. 2

c# - .Net Standard 1.4 中的动态调度

c# - .NET Core 应用程序中的 ConfigurationManager

.net - 使用 Specflow for Silverlight 处理异步

c# - .NET 核心 : HttpClientFactory: How to configure ConfigurePrimaryHttpMessageHandler without dependency injection?

c# - 如何使用 Dapper 的 Oracle 整数参数列表?