我注意到在某些情况下,Visual Studio建议这样做
await using var disposable = new Disposable();
// Do something
代替此
using var disposable = new Disposable();
// Do something
using
和await using
有什么区别?
我应该如何决定使用哪个?
经典使用调用实现Dispose()
接口的对象的IDisposable
方法。
using var disposable = new Disposable();
// Do Something...
相当于
IDisposable disposable = new Disposable();
try
{
// Do Something...
}
finally
{
disposable.Dispose();
}
新的等待使用调用并等待实现DisposeAsync()
接口的对象的IAsyncDisposable
方法。
await using var disposable = new AsyncDisposable();
// Do Something...
相当于
IAsyncDisposable disposable = new AsyncDisposable();
try
{
// Do Something...
}
finally
{
await disposable.DisposeAsync();
}
[IAsyncDisposable Interface被添加到.NET Core 3.0
和.NET Standard 2.1
中。
在.NET中,拥有非托管资源的类通常实现IDisposable接口,以提供一种用于同步释放非托管资源的机制。但是,在某些情况下,它们需要提供一种异步机制来释放(而不是同步)同步的非托管资源。提供这种机制可使使用者执行资源密集型的处置操作,而不会长时间阻塞GUI应用程序的主线程。
此接口的IAsyncDisposable.DisposeAsync方法返回代表异步处理操作的ValueTask。拥有非托管资源的类将实现此方法,并且这些类的使用者将在不再需要该对象时在对象上调用此方法。