gpt4 book ai didi

c# - IAsyncDisposable 引用实现错误?

转载 作者:行者123 更新时间:2023-12-04 15:12:44 55 4
gpt4 key购买 nike

Microsoft 为需要同时实现 IDisposable 和 IAsyncDisposable 的类提供了引用实现,比如说因为它们具有这两个成员。

https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-disposeasync

我在下面包含了完整的实现。 Dispose(disposing) 中的这些行是我不理解的部分。

(_asyncDisposableResource as IDisposable)?.Dispose();
...
_asyncDisposableResource = null;

似乎如果我有一个 CustomDisposable 的实例并且 Dispose()DisposeAsync() 之前被调用,那么 _asyncDispoableResource 字段将调用 Dispose() 而不是 DisposeAsync(如果有),然后无条件设置为 null。在这种情况下,似乎 _asyncDispoableResource 从未得到正确处理,即使稍后在 CustomDisposable 实例上调用了 DisposeAsync()

完整引用代码:

using System;
using System.IO;
using System.Threading.Tasks;

namespace Samples
{
public class CustomDisposable : IDisposable, IAsyncDisposable
{
IDisposable _disposableResource = new MemoryStream();
IAsyncDisposable _asyncDisposableResource = new MemoryStream();

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

public async ValueTask DisposeAsync()
{
await DisposeAsyncCore();

Dispose(disposing: false);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if (disposing)
{
_disposableResource?.Dispose();
(_asyncDisposableResource as IDisposable)?.Dispose();
}

_disposableResource = null;
_asyncDisposableResource = null;
}

protected virtual async ValueTask DisposeAsyncCore()
{
if (_asyncDisposableResource is not null)
{
await _asyncDisposableResource.DisposeAsync().ConfigureAwait(false);
}

if (_disposableResource is IAsyncDisposable disposable)
{
await disposable.DisposeAsync().ConfigureAwait(false);
}
else
{
_disposableResource.Dispose();
}

_asyncDisposableResource = null;
_disposableResource = null;
}
}
}

最佳答案

引用您的引用:

It is typical when implementing the IAsyncDisposable interface that classes will also implement the IDisposable interface. A good implementation pattern of the IAsyncDisposable interface is to be prepared for either synchronous or asynchronous dispose.

这意味着通过“经典”Dispose 处理对象就足够了,永远不会调用 DisposeAsync 应该无关紧要。这就是资源被设置为null的原因,所以很明显它已经被异步处理了。一次性引用的实际实现必须为此做好准备。

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

55 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com