2015-10-07 2 views
1

Я сделал эту небольшую программу, которая имеет интересное поведение, которое я не могу обойти. Идея состоит в том, чтобы это действовало как планировщик, оно выполнит команду по прошествии определенного времени. Все работает по назначению, но когда я пошел на остановку службы, я понял несколько вещей. 1. Сервис занимает много времени, чтобы завершить работу. Когда-то более 30 минут, я тоже должен был убить ПИД. 2. Чем дольше служба работает, тем дольше она останавливается. Я думаю, что это имеет какое-то отношение к тому, сколько раз команда была выполнена. 3. Я думаю, что чем короче интервал между каждой итерацией, тем проще закрыть службу.Служба Windows не остановится

Вот код, который я использую.

public void Start() 
{ 
    _cancellationToken = new CancellationTokenSource(); 
    var token = _cancellationToken.Token; 

    _pollingTask = Task.Factory.StartNew(
     () => 
     { 
      while (true) 
      { 
       try 
       { 
        Log.Debug("Call Import PDF"); 
        ConnectUncPaths(); 
        ImportPdf(); 
        Thread.Sleep(Intervall * 60000); 
        if (token.IsCancellationRequested) 
         break; 
       } 
       catch (Exception) 
       { 
        DissconnectUncPaths(); 
       } 
      } 
     }, token, TaskCreationOptions.LongRunning, TaskScheduler.Current); 
    } 

    public void Stop() 
    { 
     _cancellationToken.Cancel(); 
     _pollingTask.Wait(); 
} 

А вот скриншот

enter image description here

+4

'Thread.Sleep (Intervall * 60000);' - не очень хорошая идея. –

+0

Если только потому, что даже небольшой «интервал» из 10 подразумевает 10 минут ожидания ... –

+0

Проверить http://stackoverflow.com/a/12886071/2224701 –

ответ

3

Это не остановит, потому что Thread.Sleep не закончится, пока его задержка не вверх. Вместо этого попробуйте что-то вроде этого:

public void Start() 
{ 
    _cancellationToken = new CancellationTokenSource(); 
    var token = _cancellationToken.Token; 

    _pollingTask = Task.Factory.StartNew(
     () => 
     { 
      while (!token.IsCancellationRequested) 
      { 
       try 
       { 
        Log.Debug("Call Import PDF"); 
        ConnectUncPaths(); 
        ImportPdf(); 
        Task.Delay(TimeSpan.FromMinutes(Intervall), token) 
       } 
       catch (Exception) 
       { 
        DissconnectUncPaths(); 
        break; 
       } 
      } 
     }, token, TaskCreationOptions.LongRunning, TaskScheduler.Current); 
} 
Смежные вопросы