使用和等待使用有什么区别?我该如何决定使用哪一个呢?


21

我注意到在某些情况下,Visual Studio建议这样做

await using var disposable = new Disposable();
// Do something

代替这个

using var disposable = new Disposable();
// Do something

using和之间有什么区别await using

我应该如何决定使用哪个?


3
看起来您只能await using与a一起使用,IAsyncDisposable并且只能using与a一起使用,IDisposable因为这两个都不可以继承。唯一可以使用这两种方法的时间是具体类是否同时实现这两种方法,然后这取决于是否编写异步代码。
juharr

Answers:


31

经典同步使用

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,它表示异步处置操作。拥有非托管资源的类实现此方法,并且这些类的使用者在不再需要该对象时在对象上调用此方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.