В чем разница между использованием и ожиданием использования? И как я могу решить, какой использовать? - PullRequest
4 голосов
/ 29 октября 2019

Я заметил, что в некоторых случаях Visual Studio рекомендует делать это

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

вместо этого

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

В чем разница между using и await using?

Как мне решить, какой использовать?

1 Ответ

13 голосов
/ 29 октября 2019

Классическая синхронизация с использованием

Классическая с использованием вызова метода 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 интерфейс для предоставления механизма синхронного высвобождения неуправляемых ресурсов. Однако в некоторых случаях им необходимо предоставить асинхронный механизм для освобождения неуправляемых ресурсов в дополнение (или вместо) к синхронному . Предоставление такого механизма позволяет потребителю выполнять ресурсоемкие операции по удалению без длительной блокировки основного потока приложения с графическим интерфейсом.

Метод IAsyncDisposable.DisposeAsync этого интерфейса возвращает ValueTask , представляющий асинхронную операцию удаления. Классы, которые владеют неуправляемыми ресурсами, реализуют этот метод, и потребитель этих классов вызывает этот метод для объекта, когда он больше не нужен.

...