Класична синхронізація за допомогою
Класичний за допомогою виклику 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
оскільки жоден не успадковує інший. Ви можете використовувати будь-який варіант, якщо конкретний клас реалізує і те, і інше, і це залежить від того, ви пишете асинхронний код чи ні.