IAsyncDisposable в C#
Интерфейс IAsyncDisposable освобождает ресурсы асинхронно. Вместо блокирующего Dispose вызывают DisposeAsync: он может подождать диск или сеть и не держать поток.
Конструкция await using компилируется в try/finally с
await DisposeAsync() при выходе из области видимости.
Закроем фиктивный канал асинхронно. Сначала в консоли "work", затем "closed": освобождение идёт после блока await using. Обычный using не дождался бы асинхронного закрытия:
await using Gate gate = new Gate();
Console.WriteLine("work");
class Gate : IAsyncDisposable
{
public async ValueTask DisposeAsync()
{
await Task.Delay(1);
Console.WriteLine("closed");
}
}
Сделайте тип, который при асинхронном освобождении выводит "released". В области видимости выведите "open".