Обнаружение бездействия в службе Windows

У меня есть служба Windows, которая будет запущена (удаленно) при ее вызове. Я не хочу, чтобы служба работала, поэтому я хочу, чтобы служба автоматически останавливалась при входе в режим простоя, что означает несколько минут после последнего вызова. Я не хочу останавливать службу с моего удаленного клиента, потому что я не знаю, закончу ли я работать, поэтому я хочу использовать какое-то событие Idle на стороне службы. Есть какой-то способ? Благодарность,


person user810917    schedule 17.10.2012    source источник


Ответы (1)


Добавьте таймер в службу Windows, который сбрасывается при каждом вызове. Когда таймер истекает (через некоторое количество минут), вызовите метод Stop службы, эффективно останавливая сервер, как только он становится бездействующим.

Дополнительная информация. Чтобы сократить накладные расходы на кодирование, вы ищете точку перехвата для обработки этого таймера. Если вы используете WCF для вызовов службы, самый простой способ сделать это — добавить настраиваемый IParameterInspector в качестве расширения службы. Вы можете добавить логику таймера в метод AfterCall(), чтобы каждый вызов службы выполнялся через этот же блок кода и сбрасывал таймер. См. эту статью MSDN для получения подробной информации о реализации настраиваемого поведения.

Если вы не используете WCF, все немного сложнее. Вы можете использовать инфраструктуру АОП, такую ​​как Castle Windsor или PostSharp, или разработать свой сервис в стиле передачи сообщений. АОП позволяет вам украсить ваши методы свойством, которое будет вызывать ваш код сброса. Передача сообщений включает в себя разработку контракта вашей службы таким образом, чтобы существовала единственная общая точка входа в службу, которая проверяет входящее сообщение и направляет его правильному методу на основе его содержимого. Как вы понимаете, одна точка входа = одно место для добавления кода сброса таймера. Но ни один из них не является таким чистым или простым в реализации, как решение IMO на основе WCF.

person Chris    schedule 17.10.2012
comment
Да, я думал об этом, но я также искал какой-то другой уже определенный механизм внутри C#. Если есть...? - person user810917; 17.10.2012
comment
Другой вопрос может быть тогда: есть ли способ перехватить все вызовы службы в одном общем месте до (или после) выполнения любого метода, чтобы поместить туда этот таймер, а не редактировать все методы, чтобы вызывать методы для этого? - person user810917; 17.10.2012