Избавиться от вызова при завершении программы
Я написал собственный поставщик для Microsoft.Extensions.Logging.
Провайдер внутренне создает 3 потока, которые работают на переднем плане и используют EasyNetQ для связи с сервером RabbitMQ.
Один из потоков читает сообщения журнала из блокирующей коллекции и публикует их на Rabbit Server. Два других потока управляются EasyNetQ.
Протекторы будут корректно завершаться, когда вызывается метод dispose моего провайдера. Я проверил, чтобы убедиться.
Когда мое приложение закрывается, метод Microsoft.Extensions.Logging.LoggerFactory::Dispose не вызывается. В результате потоки переднего плана не заканчиваются.
Я также перехватил событие AppDomain.CurrentDomain.DomainUnload, чтобы я мог вызвать метод утилизации моих провайдеров.
Я уверен, что у меня есть 22 ситуации. GC не вызывает методы утилизации LoggerFactory или моего провайдера, потому что потоки все еще работают. Потоки ждут, чтобы им сказали прекратить.
Я знаю, что могу установить темы в качестве фона, и все будет очищено. Это нежелательно, поскольку я отправляю сообщения журнала приложений на сервер Rabbit. Я хотел бы получить все сообщения, которые находятся в коллекции блокировок, на сервер до завершения приложения.
Любые предложения приветствуются.
Спасибо