2009-03-16 2 views
19

У меня есть служба Windows, которая каждые 10 секунд сканирует папку. Я получаю «служба не реагировала на стартовую команду своевременно» при попытке запустить ее.Службы Windows: цикл OnStart - мне нужно делегировать?

У меня есть цикл выключения режима в OnStart так:

public void OnStart(string[] args) 
{ 
    while (!_shouldExit) 
    { 
     //Do Stuff 

     //Repeat 
     Thread.Sleep(_scanIntervalMillis); 
    } 
} 

Является ли это то, что вызывает ошибку? Должен ли я делегировать этот метод?

ответ

39

OnStart должно только начало работа; он не несет ответственности за это. Обычно это означает, что для создания реальной работы создается новый поток. Ожидается, что OnStart завершится быстро. Например:

public void OnStart(string[] args) // should this be override? 
    { 
     var worker = new Thread(DoWork); 
     worker.Name = "MyWorker"; 
     worker.IsBackground = false; 
     worker.Start(); 
    } 
    void DoWork() 
    { 
     // do long-running stuff 
    } 
+0

Что происходит с потоком, когда служба завершается? – JSideris

+0

@Bizorke, если вы имеете в виду прекращение внезапно: это просто убитый средний поток, то же самое, что и прекращение любого процесса. Если вы имеете в виду «остановлен», то: что бы ни сказал ваш код, –

+0

@MarcGravell. Существует ли конкретная рабочая среда.IsBackground false? таким образом, что поток является передним потоком? – Thomas

6

Метод OnStart не должен блокироваться. Вам нужно создать рабочий поток, который будет выполнять эту работу. Вы также можете взглянуть на класс FileSystemWatcher для сканирования уведомлений об изменении файловой системы.

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