Классическая синхронизация с использованием
Классическое использование вызывает 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 , представляющее асинхронную операцию удаления. Классы, которые владеют неуправляемыми ресурсами, реализуют этот метод, и потребитель этих классов вызывает этот метод для объекта, когда он больше не нужен.
await using
с,IAsyncDisposable
и вы можете использовать толькоusing
с,IDisposable
так как ни один не наследует от другого. Единственный раз, когда вы можете использовать любой из них, это если конкретный класс реализует оба, и тогда это зависит от того, пишете ли вы асинхронный код или нет.