Класична синхронізація за допомогою
Класичний за допомогою виклику 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, класи, які володіють некерованими ресурсами, зазвичай реалізують інтерфейс ID, що використовується, щоб забезпечити механізм звільнення некерованих ресурсів синхронно. Однак в деяких випадках їм потрібно забезпечити асинхронний механізм звільнення некерованих ресурсів на додаток до (або замість) синхронного . Забезпечення такого механізму дає можливість споживачеві виконувати операції з розпорядження ресурсами, не блокуючи основний потік програми GUI протягом тривалого часу.
Метод IAsyncDisposable.DisposeAsync цього інтерфейсу повертає ValueTask, який представляє асинхронну операцію розпорядження. Класи, які володіють некерованими ресурсами, реалізують цей метод, і споживач цих класів називає цей метод об’єктом, коли він більше не потрібен.
await usingз a,IAsyncDisposableа ви можете використовувати лишеusingз,IDisposableоскільки жоден не успадковує інший. Ви можете використовувати будь-який варіант, якщо конкретний клас реалізує і те, і інше, і це залежить від того, ви пишете асинхронний код чи ні.