Как закрыть службу Singleton, которая не поддерживает IDisposable - PullRequest
2 голосов
/ 24 июня 2019

У меня есть одно сервисная служба, которая общается с сервисной шинойМоя проблема в том, что я не могу элегантно реализовать IDisposable, поскольку "Закрыть" вызовы клиентов служебной шины async - CloseAsync().

Таким образом, мой класс обслуживания также реализует метод CloseAsync, который относится к клиенту служебной шины CloseAsync.Из того, что я могу собрать, мои варианты:

  1. Реализация утилизации и блокировки при вызове CloseAsync на клиенте.Чувствует себя не так.
  2. Инициализируйте переменную-член в startup.cs, добавьте ее как Singleton, используйте ApplicationLifetime, чтобы зарегистрировать обработчик ShutDown, и закройте там мои клиенты.Похоже на излишество.(Я пробовал это, но код в моем обработчике ShutDown либо не ударил, либо не запускается)
  3. Просто оставьте его, так как приложение все равно закрывается.Заманчиво, но тоже нехорошо (мне нравится убирать).

Есть ли способ перехватить удаление служб в контейнере DI (я использую стандарт Microsoft.Extensions.DependencyInjection.ServiceCollection)?

Можно ли блокировать асинхронный вызов в методе Dispose?Таким образом, я смогу избавиться от своего класса.

Есть ли другой способ сделать это, которого мне не хватает?

1 Ответ

1 голос
/ 24 июня 2019

Если у вас есть один экземпляр этого объекта в течение срока действия вашего приложения, почему вы заботитесь об его утилизации?Когда приложение закрывается, его пространство памяти освобождается ОС, эффективно удаляя весь набор приложений и любые ресурсы, которые оно могло создать.

IDisposable (явное удаление) имеет смысл для типов объектов, которые потребляютзначительный объем памяти и может создаваться много раз (обычно в быстрой последовательности) в течение срока службы вашего приложения;например, bitmap объекты, которые выделяют большой буфер для данных изображения, stream s и другие данные, переносящие / манипулирующие объектами, которые вы бы создавали много раз.Вид вещей, которые вы бы положили в блок using.

Вот практическое правило:

Вам нужно IDisposable только в том случае, если: каждый экземпляр объекта потребляет значительный объем памяти (например, десятки мегабайт), вам нужно создать и сохранить многоэкземпляры сразу, или вам нужно создать много экземпляров в очень быстрой последовательности.В этих случаях вы извлечете выгоду из утилизации объекта вручную.Если они не соответствуют вашему варианту использования, сборщик мусора выполнит более чем достаточную работу по очистке неиспользуемых ресурсов.

Должен ли я реализовать IDisposable на синглтоне?

Спасибо @Broots за полезную ссылку.

...