2015-03-19 2 views
2

Я получаю «Услуга не может принимать управляющие сообщения в это время» при попытке остановить службу. Я не понимаю, почему это происходит. Может кто-то помочь мне с этим? Я думал, что мой замок помешает этому.Служба Windows C# не может остановить

Метод Patrol занимает около 30-40 секунд для запуска.

private static readonly string ConnectionString = ConfigurationManager.AppSettings["ConnectionString"]; 
private static readonly int runMinInterval = Convert.ToInt32(ConfigurationManager.AppSettings["RunMinInterval"]); 
private Object myLock = new Object(); 
private Timer timer; 

public DealWatchdogService() 
{ 
    InitializeComponent(); 
} 

protected override void OnStart(string[] args) 
{ 
    Watchdog.Patrol(ConnectionString, new DealWatchdogService()); 
    timer = new Timer(); 
    timer.Enabled = true; 
    timer.Interval = 60000 * runMinInterval; 
    timer.AutoReset = false; 
    timer.Start(); 
    timer.Elapsed += timer_Elapsed; 
} 

protected override void OnStop() 
{ 
    lock (myLock) 
    { 
     timer.Stop(); 
     timer = null; 
     base.OnStop(); 
    } 
} 

private void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    lock (myLock) 
    { 
     if (timer == null) 
       return; 
     Watchdog.Patrol(tycheConnection, new DealWatchdogService()); 
     timer.Start(); 
    } 
} 

EDIT: Может быть, какая-то помощь, но служба останавливается нормально иногда, но когда он был запущен и работает в течение недели или около того, я получаю эту ошибку.

+0

Если это 'System.Timers.Timer', вы не должны использовать оба параметра [' Enabled'] (https://msdn.microsoft.com/en-us/library/system.timers.timer.enabled (v = vs.110) .aspx) и 'Start':« Установка Enabled to true совпадает с вызовом Start »(и вы, вероятно, не должны включать его, прежде чем вы настроили нужный интервал). Наверное, это не ваша текущая проблема, но стоит иметь в виду. –

+0

Да, это System.Timers.Timer. Я посмотрю на это и поменяю, конечно. – MrProgram

+0

Вы используете 'myLock' где угодно, кроме OnStop()? если не блокировка не приносит никакой пользы, только один поток за раз когда-либо вызовет OnStop() –

ответ

1

Метод Patrol занимает около 30-40 секунд для запуска.

Я думаю, что проблема может быть в том, что OnStart() занимает слишком много времени, потому что длина Patrol заканчивается и устанавливает флаг, указывающий, что система заблокирована. Поместите код запуска в фоновый поток, чтобы OnStart мог завершить работу быстрее.

protected override void OnStart(string[] args) 
{ 
    //This line does not block. 
    Task.Run(() => RealStart()); 
} 

private void RealStart() 
{ 
    Watchdog.Patrol(ConnectionString, new DealWatchdogService()); 
    timer = new Timer(); 
    //timer.Enabled = true; //Calling .Start() has the same effect. 
    timer.Interval = 60000 * runMinInterval; 
    timer.AutoReset = false; 
    timer.Elapsed += timer_Elapsed; 
    timer.Start(); //Start should be called after you have set .Elapsed 
} 

Единственное, что это может быть что-то происходит не так внутри timer_Elapsed, но вы никогда не показали нам, что делает этот код.

+0

Исправьте меня, если я ошибаюсь, но не вызывается OnStart только при запуске службы? Услуга начинается нормально. Но стоит ли OnStart() блокировать? – MrProgram

+0

@krillezzz это, но я видел, как услуги попадают в странное состояние, когда материал выходит из строя внутри OnStart(). –

+0

Хорошо спасибо. Попробуем это – MrProgram

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