Как вызвать DisposeAsync из финализатора класса?

что мне делать, если я столкнусь, например, со следующей ситуацией: мой класс является оберткой вокруг какого-то стороннего класса и должен будет вызывать асинхронный метод из обернутого класса внутри моего Dispose? (см. код ниже). Конечно, я буду реализовывать IAsyncDisposable.

А вот одноразовые Microsoft рекомендует чтобы можно было избавляться от их финализаторов

И мой вопрос, как мне это сделать здесь?

В пример документации объект async-disposable-only (_asyncDisposableResource) не удаляется в случае удаления из финализатора, если он также не поддерживает IDisposable.

Кстати, они говорят, что синхронные пары для асинхронного метода лучше не поддерживать: см. здесь, так что такая ситуация вполне вероятна.

    public class MyWrapperForTheRepository: IAsyncDisposable
    {
        private ThirdPartyRepository _wrappedRepository = new ThirdPartyRepository();

        public void MakeSomeChanges() => _wrappedRepository.MakeSomeChanges();


        public async ValueTask DisposeAsync()
        {
            await _wrappedRepository.SaveAllTheChangesAsync();
            _wrappedRepository = null;
        }

        ~MyWrapperForTheRepository()
        {
            ?????????????????????
        }
    }

Где вы видите такую ​​рекомендацию? То, что у вас есть, хорошо.

Ermiya Eskandary 09.04.2022 20:02

Примечание. Вы должны удалять ресурсы неуправляемый только из финализатора.

Matthew Watson 09.04.2022 20:12
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
2
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

But Microsoft recommends disposables to be able to be disposed from their finalizers

Нисколько. Фактически, финализаторы должны вызывать нет (без параметров) Dispose(), и они также должны вызывать нетDisposeAsync().

Финализаторы — Только для удаления неуправляемых ресурсов. Лично я рекомендую, чтобы каждый тип либо имел неуправляемые ресурсы или управляемых ресурсов, и никогда оба. Полученный код намного чище, чем следующий шаблон Dispose(bool disposing).

Другие вопросы по теме