Вы испытываете это поведение, потому что ваш метод Stop () занимает некоторое время, но не отвечает на запрос на остановку.
Ваш метод по сути выглядит так:
Stop() {
log-stopping;
wait-a-while;
log-stopped;
}
Пока вы ждете, статус сервиса остается «Работает».Это приводит к тому, что инициатор запроса (может быть сама Windows или другая программа) продолжает повторную отправку запроса на остановку, что приводит к множественным параллельным / перекрывающимся вызовам Stop ().Это учитывает первые 10 строк в журнале, который вы включили.
Вы видите, что для завершения «ожидания» требуется почти 20 секунд (с 05:39:45 до 05:40:04).
После этого похоже, что Верхняя Полка может застрять.Это вызывает больше сообщений, которые будут отправлены.(Обратите внимание, что в следующих строках вашего журнала пары остановок и стартов регистрируются одновременно, потому что ваши задачи остановлены и ожидание отсутствует).
Чтобы устранить проблему, вам необходимо:
Измените свой вызов WhenStopped () для передачи параметра HostControl в Stop ():
serviceInstance.WhenStopped ((execute, hostControl) => execute.Stop (hostControl));
Обновите метод Stop (), чтобы он принял параметр HostControl и сделал этот вызов перед вызовом Task.WaitAll ():
hostControl.RequestAdditionalTime (TimeSpan.FromSeconds (30));
Это сообщит Windows, что ваша служба получила запрос и может работать над ним до 30 секунд.Это должно избежать повторных вызовов.
Ссылка: Документация верхнего полка