DisposeAsync
DisposeAsync у
IAsyncDisposable
можно await. Повторный вызов
не бросает, как и
Dispose.
await using вызывает его один раз
в конце блока; второй вызов показывают
явно после блока.
Синтаксис
await resource.DisposeAsync();
Пример
Давайте вызвать DisposeAsync после 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 = new AsyncGate();
await using (gate)
{
}
await gate.DisposeAsync();
Console.WriteLine("abcde");
}
}
Результат выполнения кода:
"abcde"
Пример
Давайте вызвать DisposeAsync дважды подряд:
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 = new AsyncGate();
await gate.DisposeAsync();
await gate.DisposeAsync();
Console.WriteLine(gate.Closed);
}
}
Результат выполнения кода:
True
Пример
Давайте проверить флаг после одного await:
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 = new AsyncGate();
await gate.DisposeAsync();
Console.WriteLine(gate.Closed);
}
}
Результат выполнения кода:
True
Смотрите также
-
IAsyncDisposable,
интерфейс -
IDisposable,
синхронный аналог -
Dispose,
синхронный метод -
ref struct,
тип на стеке