VB.NET中如何结合Using语句使用IAsyncDisposable接口?
在VB.NET(.NET 6)中使用IAsyncDisposable的方案
VB.NET在.NET 6版本中确实没有提供C#那样的await using语法糖,但依然可以合理利用IAsyncDisposable接口来异步释放资源,以下是几种可行方案:
方案一:手动结合Using与异步释放
如果你的类同时实现了IDisposable和IAsyncDisposable,VB.NET的Using语句只会自动调用同步的Dispose()方法。这种情况下,你可以在Using块内部完成操作后,手动调用DisposeAsync()并等待其完成:
Using resource As New MyAsyncDisposableResource() ' 执行资源相关操作 Await resource.DoAsyncWork() ' 手动异步释放资源 Await resource.DisposeAsync() End Using
注意:如果你的类仅实现
IAsyncDisposable而未实现IDisposable,则无法直接使用Using语句,此时可以通过Try/Finally块来管理生命周期:
Dim resource As New MyAsyncDisposableResource()
Try
Await resource.DoAsyncWork()
Finally
Await resource.DisposeAsync()
End Try
## 方案二:封装异步使用的辅助方法 你可以编写一个通用的扩展方法,模拟`await using`的行为,让代码更简洁且复用性更高: ```vb Imports System.Runtime.CompilerServices Module AsyncDisposableExtensions <Extension> Public Async Function AsyncUsing(Of T As IAsyncDisposable)(resource As T, action As Func(Of Task)) As Task Try Await action() Finally Await resource.DisposeAsync() End Try End Function ' 支持返回值的重载 <Extension> Public Async Function AsyncUsing(Of T As IAsyncDisposable, TResult)(resource As T, func As Func(Of Task(Of TResult))) As Task(Of TResult) Try Return Await func() Finally Await resource.DisposeAsync() End Try End Function End Module
使用方式如下:
Await New MyAsyncDisposableResource().AsyncUsing(Async Sub() Await resource.DoAsyncWork() End Sub) ' 带返回值的场景 Dim result = Await New MyAsyncDisposableResource().AsyncUsing(Async Function() Return Await resource.GetAsyncResult() End Function)
注意事项
- 若类同时实现两个接口,避免在同步
Dispose()中直接调用DisposeAsync().GetAwaiter().GetResult(),这种同步等待异步操作的方式容易引发死锁,仅在无其他选择的极端场景下考虑。 - 优先确保
DisposeAsync()实现正确,涵盖所有异步资源的释放逻辑(如HttpClient实例、数据库连接的异步关闭等)。
内容的提问来源于stack exchange,提问作者Keith Stein
相关产品推荐
相关产品推荐

