IAsyncDisposable
IAsyncDisposable задаёт
DisposeAsync,
который возвращает ValueTask.
await using вызывает его в конце
блока. Синхронный вариант -
IDisposable.
Синтаксис
await using (IAsyncDisposable resource = new AsyncGate())
{
}
Пример
Давайте закрыть AsyncGate через await using:
using System;
using System.Threading.Tasks;
class AsyncGate : IAsyncDisposable
{
public bool Closed { get; private set; }
public async ValueTask DisposeAsync()
{
await Task.CompletedTask;
Closed = true;
}
}
class Program
{
static async Task Main()
{
AsyncGate gate;
await using (gate = new AsyncGate())
{
}
Console.WriteLine(gate.Closed);
}
}
Результат выполнения кода:
True
Пример
Давайте проверить флаг внутри блока:
using System;
using System.Threading.Tasks;
class AsyncGate : IAsyncDisposable
{
public bool Closed { get; private set; }
public async ValueTask DisposeAsync()
{
await Task.CompletedTask;
Closed = true;
}
}
class Program
{
static async Task Main()
{
await using (AsyncGate gate = new AsyncGate())
{
Console.WriteLine(gate.Closed);
}
}
}
Результат выполнения кода:
False
Пример
Давайте использовать современный await using:
using System;
using System.Threading.Tasks;
class AsyncGate : IAsyncDisposable
{
public bool Closed { get; private set; }
public async ValueTask DisposeAsync()
{
await Task.CompletedTask;
Closed = true;
}
}
class Program
{
static async Task Main()
{
await using AsyncGate gate = new AsyncGate();
Console.WriteLine(gate.Closed);
}
}
Результат выполнения кода:
False
Смотрите также
-
DisposeAsync,
асинхронное закрытие -
IDisposable,
синхронное закрытие -
Dispose,
методDispose -
ref struct,
тип без упаковки