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