Некоторые объекты несут ответственность за обеспечение очистки объектов вне их. Такие объекты могут быть единственными в любом месте с информацией и стимулом, необходимым для выполнения такой очистки; если они этого не сделают, этого не произойдет. IDisposable существует, чтобы позволить таким объектам выполнять свои обязанности.
Несмотря на название, IDisposable не существует для уничтожения объектов. Скорее, оно существует, чтобы позволить объектам навести порядок в своих делах, чтобы их можно было безопасно оставить (и в конечном итоге уничтожить сборщиком мусора). Для метода Dispose объекта вполне уместно выполнять свои обязанности, передавая их другому объекту, при условии, что другому объекту можно доверять для их выполнения. По сути, это похоже на то, что вы делаете.
Единственный аспект, который может быть сложным в такой ситуации, как ваша, - это решить, должен ли Dispose просто приводить вещи в движение, чтобы вещи были очищены, или он должен оставаться на месте, пока они на самом деле не будут. Существуют веские аргументы в пользу обоих подходов. Наличие синхронного метода Dispose полезно, если вызывающему коду необходимо выполнить очистку до его продолжения, а также может быть полезно, если в процессе очистки что-то пойдет не так. Имея Dispose, бросить исключение уродливо (особенно потому, что не существует чистого шаблона, по которому Dispose не может потерять любое ожидающее исключение, если оно возникает), но перехват исключения, когда контекст выполнения все еще существует, гораздо приятнее, чем обнаружение после того, как произошла какая-то ошибка. в какое-то неизвестное время, делая какие-то неизвестные действия. К сожалению, использование синхронного удаления может замедлить очистку и иногда может привести к тупику. Использование асинхронного удаления может улучшить скорость отклика, но код, который ожидает, что Dispose сделает что-то вроде файла или устройства ввода-вывода, может быть удивлен, если устройство не будет доступно в течение некоторого времени после возвращения Dispose. В некоторых случаях может быть полезно иметь метод «Открыть», чтобы проверить, выполняется ли удаление ресурса, и дождаться его завершения, если так.