У меня есть служба Windows, которая будет запущена (удаленно) при ее вызове. Я не хочу, чтобы служба работала, поэтому я хочу, чтобы служба автоматически останавливалась при входе в режим простоя, что означает несколько минут после последнего вызова. Я не хочу останавливать службу с моего удаленного клиента, потому что я не знаю, закончу ли я работать, поэтому я хочу использовать какое-то событие Idle на стороне службы. Есть какой-то способ? Благодарность,
Обнаружение бездействия в службе Windows
Ответы (1)
Добавьте таймер в службу Windows, который сбрасывается при каждом вызове. Когда таймер истекает (через некоторое количество минут), вызовите метод Stop службы, эффективно останавливая сервер, как только он становится бездействующим.
Дополнительная информация. Чтобы сократить накладные расходы на кодирование, вы ищете точку перехвата для обработки этого таймера. Если вы используете WCF для вызовов службы, самый простой способ сделать это — добавить настраиваемый IParameterInspector в качестве расширения службы. Вы можете добавить логику таймера в метод AfterCall(), чтобы каждый вызов службы выполнялся через этот же блок кода и сбрасывал таймер. См. эту статью MSDN для получения подробной информации о реализации настраиваемого поведения.
Если вы не используете WCF, все немного сложнее. Вы можете использовать инфраструктуру АОП, такую как Castle Windsor или PostSharp, или разработать свой сервис в стиле передачи сообщений. АОП позволяет вам украсить ваши методы свойством, которое будет вызывать ваш код сброса. Передача сообщений включает в себя разработку контракта вашей службы таким образом, чтобы существовала единственная общая точка входа в службу, которая проверяет входящее сообщение и направляет его правильному методу на основе его содержимого. Как вы понимаете, одна точка входа = одно место для добавления кода сброса таймера. Но ни один из них не является таким чистым или простым в реализации, как решение IMO на основе WCF.