gpt4 book ai didi

c# - 处理泄漏的 IAsyncDisposable 实例的推荐方法是什么?

转载 作者:太空狗 更新时间:2023-10-29 23:19:52 25 4
gpt4 key购买 nike

我一直在熟悉 C# 8 和 .NET Core 3.0 中添加的一些(计划中的)内容,但不确定实现 IAsyncDisposable 的正确方法(在撰写本文时,此链接几乎没有任何指导)。

特别是,我不清楚在未明确处置实例的情况下该怎么做——也就是说,它没有包装在 async using(...) 中并且未明确调用 .DisposeAsync()

我的第一个想法是做与实现 IDisposable 时相同的事情。 :

  • 我的 DisposeAsync() 实现使用 disposing: true 调用 DisposeAsync(bool disposing)
  • 实现调用 DisposeAsync(disposing: false)
  • 的终结器(使用 ~MyType())
  • DisposeAsync(bool disposing) 实际上释放和/或处置所有内容,如果 disposing == true 则抑制终结。

我担心的是,在终结器中没有等待 DisposeAsync(bool) 的结果,并且在终结器中显式等待似乎真的很危险。

当然,“只是泄漏”似乎也不太理想。

为了具体说明,这里有一个(简化的)示例类,它确实有一个终结器:

internal sealed class TestAsyncReader: IAsyncDisposable
{
private bool IsDisposed => Inner == null;
private TextReader Inner;
internal TestAsyncReader(TextReader inner)
{
Inner = inner;
}

// the question is, should this exist?
~TestAsyncReader()
{
DisposeAsync(disposing: false);
}

private ValueTask DisposeAsync(bool disposing)
{
// double dispose is legal, but try and do nothing anyway
if (IsDisposed)
{
return default;
}

// should a finalizer even exist?
if (disposing)
{
GC.SuppressFinalize(this);
}

// in real code some resources explicitly implement IAsyncDisposable,
// but for illustration purposes this code has an interface test
if (Inner is IAsyncDisposable supportsAsync)
{
var ret = supportsAsync.DisposeAsync();
Inner = null;
return ret;
}

// dispose synchronously, which is uninteresting
Inner.Dispose();
Inner = null;
return default;
}

public ValueTask DisposeAsync()
=> DisposeAsync(disposing: true);
}

那么,是否有任何关于正确处理泄漏的 IAsyncDisposable 实例的指南?

最佳答案

基于如何在 .NET Core 类中实现它的示例(如 here )和来自 there 的一些建议,我会说当您需要实现 IAsyncDisposable 时,好的做法是同时实现 IAsyncDisposableIDisposable。在这种情况下,IAsyncDisposable 将仅在需要异步处理时负责明确的场景,而 IDisposable 应该根据一次性模式实践照常实现,并且它将服务所有回退场景,包括事情最终确定时的场景。因此,您不需要像 DisposeAsync(bool disposing) 这样的东西——异步处理不能也不应该发生在终结器中。唯一的坏消息是您必须支持两种资源回收路径(同步和异步)。

关于c# - 处理泄漏的 IAsyncDisposable 实例的推荐方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55677445/

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