2013-11-25 2 views
-1

Мое требование здесь, служба Windows должна запускаться каждые 50 секунд на сервере. Для этого я использую ниже код в OnStart() методОстановка C# Служба Windows TimerCallBack

private Timer stateTimer; 
private TimerCallback timerDelegate; 

timerDelegate = new TimerCallback(StartService); 
stateTimer = new Timer(timerDelegate, null, 0, 50/0.01); 

здесь StartService мое имя метода, который вызывается через каждые 50 секунд

Так что теперь сервис работает каждые 50 секунд, это нормально. Теперь, какой код я должен написать, чтобы остановить это выполнение в методе OnStop() Чтобы полностью остановить. Необходимость срочно нужна.

+0

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

+0

HI Anders, Можете ли вы подробнее рассказать об этом, я попытался использовать этот codestateTimer.Change (Timeout.Infinite, Timeout.Infinite); Но когда я реализую этот код в OnStop, ошибка бросается, поскольку ссылка на объект не установлена ​​на объект. Как я могу ссылаться на тот же объект, который ссылается на метод OnStart – user2979719

+0

Вы имеете в виду, что вы только хотели бы остановить таймер от «тикания» ", вы не хотите вообще прекратить обслуживание? В этом случае, как бы вы возобновили таймер «тикает»? –

ответ

0

Из вашего комментария, я предполагаю, что вы в основном заинтересованы в доступе к объекту Timer в методе обратного вызова. Если это то, что вы хотите, вы должны использовать one-argument Timer constructor, потому что этот конструктор будет устанавливать переменную state, которая передается методу обратного вызова самому объекту Timer.

Таким образом, вы должны инициализировать таймер и установить dueTime и period вроде этого:

stateTimer = new Timer(timerDelegate); 
stateTimer.Change(0, 50000); // for an interval of 50 seconds 

Затем в вашем таймера метод обратного вызова, вы можете получить доступ к Timer объект так:

void StartService(object state) { 
    var myTimer = (Timer)state; 
    ... 
} 

Теперь, если вы используете этот подход, чтобы остановить таймер от тикания, например позвонив по телефону myTimer.Change(Timeout.Infinite, Timeout.Infinite) в StartService, обратный вызов таймера больше не будет вызываться. Если одновременно будет выполняться некоторая другая нить, служба будет работать без нагрузки на неопределенный срок или, по крайней мере, до тех пор, пока служба не будет остановлена ​​вручную или перезапустится система. На мой взгляд, было бы лучше вызвать метод ServiceBase.Stop вместо того, чтобы остановить таймер от тикания.

Смежные вопросы