【问题标题】:What is the difference between using and await using? And how can I decide which one to use?使用和等待使用有什么区别?我如何决定使用哪一个?
【发布时间】:2020-02-24 20:46:33
【问题描述】:

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

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

而不是这个

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

usingawait using 有什么区别?

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

【问题讨论】:

  • 看起来您只能将await usingIAsyncDisposable 一起使用,并且您只能将usingIDisposable 一起使用,因为两者都不会从另一个继承。唯一可以使用的情况是具体类是否实现了两者,然后取决于您是否正在编写异步代码。

标签: c# c#-8.0


【解决方案1】:

经典同步使用

经典 using 调用实现IDisposable 接口的对象的Dispose() 方法。

using var disposable = new Disposable();
// Do Something...
    

相当于

IDisposable disposable = new Disposable();
try
{
    // Do Something...
}
finally
{
    disposable.Dispose();
}

新的异步等待使用

新的 await 使用调用和 await 实现 IAsyncDisposable 接口的对象的 DisposeAsync() 方法。

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

【讨论】:

  • 既然using 是语法糖,为什么不直接使用处理这两种情况呢?
  • 可能是明确的。
  • @Squirrelkiller 因为他们没有做同样的事情。如果您有一个实现两个接口的对象,您是同步还是异步处理它?一个只在非异步上下文中实现IAsyncDisposable 的对象呢?
猜你喜欢
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2012-01-16
  • 2021-04-15
  • 1970-01-01
  • 2016-12-27
相关资源
最近更新 更多