Яка різниця між використанням та очікуванням використання? І як я можу вирішити, який з них використовувати?


21

Я помітив, що в деяких випадках Visual Studio рекомендує це зробити

await using var disposable = new Disposable();
// Do something

замість цього

using var disposable = new Disposable();
// Do something

У чому різниця між usingі await using?

Як я повинен вирішити, який саме використовувати?


3
Схоже, ви можете використовувати тільки await usingз a, IAsyncDisposableа ви можете використовувати лише usingз, IDisposableоскільки жоден не успадковує інший. Ви можете використовувати будь-який варіант, якщо конкретний клас реалізує і те, і інше, і це залежить від того, ви пишете асинхронний код чи ні.
juharr

Відповіді:


31

Класична синхронізація за допомогою

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.