IAsyncDisposable

Вроде как обещнулся в комментариях раскрыть эту тему по этому вот. Несколько раз к ней возвращался для изучения и сейчас понял почему. Обычно на собеседованиях спрашивают или сложную теорию или "хитрости" - какие-то неочевидные вещи. Так вот с IAsyncDisposable каких -то супер скрытых камней нет.

Вот пример реализации (с сайта Microsoft):

`public async ValueTask DisposeAsync() { await DisposeAsyncCore().ConfigureAwait(false);

GC.SuppressFinalize(this); }

ValueTask - интересно, но это в целом рекомендация для асинхронных интерфейсов использовать ValueTask, так как мы не знаем вдруг в итоге будет синхронно в реализации. .ConfigureAwait(false) - тоже интересно... Но это тоже глобальная рекомендация, для избежания deadlock'ов при реализации библиотек использовать ConfigureAwait(false). GC.SuppressFinalize(this) - на случай если в унаследованном классе будет деструктор. Еще пара моментов. 1.При использовании можно(и нужно) использовать await using. Если явно не указывать область видимости через фигурные скобки, то она до конца метода. 2.Если зарегистрировать класс с IAsyncDisposable в DI контейнер, а потом сделать например вот так `using var scope = AppFactory.Services.CreateScope();

то получим исключение - "type only implements IAsyncDisposable. Use DisposeAsync to dispose the container". Все тоже достаточно логично и понятно. scope поддерживает только IDisposable и асинхронный вариант не вызовется, поэтому DI об этом предупреждает.

#junior #middle``