Answers:
Classic 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接口在加.NET Core 3.0
和.NET Standard 2.1
。
在.NET中,拥有非托管资源的类通常实现IDisposable接口,以提供同步释放非托管资源的机制。但是,在某些情况下,除了(或代替)同步资源之外,他们还需要提供一种异步机制来释放非托管资源。提供这种机制使使用者能够执行资源密集型的处置操作,而不会长时间阻塞GUI应用程序的主线程。
此接口的IAsyncDisposable.DisposeAsync方法返回一个ValueTask,它表示异步处置操作。拥有非托管资源的类实现此方法,并且这些类的使用者在不再需要该对象时在对象上调用此方法。
await using
与a一起使用,IAsyncDisposable
并且只能using
与a一起使用,IDisposable
因为这两个都不可以继承。唯一可以使用这两种方法的时间是具体类是否同时实现这两种方法,然后这取决于是否编写异步代码。