c# - 我的库应该同时实现 IDisposable 和 IAsyncDisposable 吗?

标签 c# .net idisposable

已经有一个similar question about it但我的问题是关于向客户公开的类(class)。

public class MyClass : IAsyncDisposable {
  public ValueTask DisposeAsync() => DoAsyncStuff();
}

此类的处理是异步的,IDisposable 的实现会阻塞线程。

public void Dispose() => DisposeAsync().GetAwaiter().GetResult();

如果 IDisposable 在类上实现并且用户处于同步上下文中,那么他们使用 using 语句:using (var c = new MyClass( )) {},这会阻塞用户后面的线程,我认为这非常糟糕。相反,我宁愿不实现 IDisposable 并强制用户使用这种显式形式:

MyClass c;
try { c = new MyClass(); }
finally { c.DisposeAsync().GetAwaiter().GetResult(); }

这更冗长,但至少用户不会感到意外。

我没有包含我的库的代码示例,因为这是一个一般性问题。那么当 Dispose 方法在您背后同步等待 Task 时,您是怎么想的?

最佳答案

您的推理是合理的,在这种情况下:是的,我只会实现 IAsyncDisposable

至于同步上下文中的调用者:即使是这种显式形式也应该积极劝阻。事实上,异步具有传染性,接触异步组件的代码也必须是异步的,这很正常。因此强制调用者使用异步上下文是完全合理的,IMO。

关于c# - 我的库应该同时实现 IDisposable 和 IAsyncDisposable 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62813087/

相关文章:

c# - WatIn 的右键单击方法?

C# HttpClient PostAsync 将 204 变成 404

c# - 如何从 Controller MVC 中获取选定的下拉值

C# 动态字段取决于 "T"类型,没有硬编码

.net - 在这种情况下,.Net 会为我调用 Dispose 吗?

c# - 为什么方法调用会因参数异常而失败?

.net - 编写迷你语言

.net - Entity Framework 4.0 Entity SQL 传递 null ObjectParameter 参数

c# - 继承BackgroundService和Dispose()

WPF - 是否必须处置 HwndSource?