await using
Запись await using работает с типами,
реализующими IAsyncDisposable.
При выходе из блока или метода вызывают
DisposeAsync. Для синхронного
освобождения используют
using
и using var.
В Main здесь допустим
static async Task Main.
Синтаксис
await using (var res = new Door())
{
}
await using var res = new Door();
Пример
Давайте освободим ресурс через
await using с блоком:
using System;
using System.Threading.Tasks;
class Door : IAsyncDisposable
{
public ValueTask DisposeAsync()
{
Console.WriteLine("closed");
return ValueTask.CompletedTask;
}
}
class Program
{
static async Task Main()
{
await using (var res = new Door())
{
Console.WriteLine("open");
}
}
}
Результат выполнения кода:
"open"
"closed"
Пример
Давайте применим await using var
без отдельного блока:
using System;
using System.Threading.Tasks;
class Door : IAsyncDisposable
{
public ValueTask DisposeAsync()
{
Console.WriteLine("closed");
return ValueTask.CompletedTask;
}
}
class Program
{
static async Task Main()
{
await using var res = new Door();
Console.WriteLine("open");
}
}
Результат выполнения кода:
"open"
"closed"
Пример
Давайте сохраним флаг в DisposeAsync
и выведем его после блока:
using System;
using System.Threading.Tasks;
class Door : IAsyncDisposable
{
public string Last = "";
public ValueTask DisposeAsync()
{
Last = "closed";
return ValueTask.CompletedTask;
}
}
class Program
{
static async Task Main()
{
Door door;
await using (door = new Door())
{
Console.WriteLine("open");
}
Console.WriteLine(door.Last);
}
}
Результат выполнения кода:
"open"
"closed"