2015-10-07 229 views
1

我已經制作了一個有趣的行爲,我無法解決這個小程序。 這個想法就像是一個調度程序,它會在特定的時間過後執行一個命令。一切都按預期工作,但是當我去關閉服務時,我意識到了一些事情。 1.服務需要很長時間才能關閉。有時超過30分鐘,我也必須殺死PID。 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); 
}