2013-03-01 48 views
1

所以我有一個Windows服務 和我的OnStart我是否需要在OnStop方法中的Windows服務中終止任務?

partial class AppServices : ServiceBase 
    { 
     private static readonly ILog Log = LogManager.GetCurrentClassLogger(); 
     private Task _task; 

     public AppServices() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      Log.Info("Service started"); 

      _task = Task.Factory.StartNew(StartWork, TaskCreationOptions.LongRunning); 
     } 

     protected override void OnStop() 
     { 
      Log.Info("Service stopped"); 
     } 

     private void StartWork() 
     { 
      while(true) 
      { 
       // grab some data from db or services 
      } 
     } 

開始做任務,我需要補充的CancellationToken和調用OnStop停止工作或沒有必要?因爲服務停止時 - 任務也會停止。它是否安全?

+0

OnStop()允許您進行清理或persitency-things,如果必要的話。之後您的服務將關閉(或者在30秒後,如果您尚未準備就緒)。 – TGlatzer 2013-03-01 13:57:44

回答

11

你正以130公里的速度在高速公路上行駛。突然你看到一位警察叫你停下來。 當你發現他,你在A點 您可以:

  1. 忽略他的命令
  2. 停止瞬間(在A點)變換車道,並用大爆炸崩潰。
  3. 停止逐漸但安全地降低車輛的速度,並最終達到B點的0 kmph。 B點儘可能接近A點,但儘可能不要危及任何人。

在現實生活中,任何人都會選擇3)。 在.NET中,根據應用程序的性質和重要性,您可以選擇1)或2)。

這取決於你是否要風險:

  1. 警方(通過任務管理器殺死)
  2. 被追崩潰(鬆重要的數據,或者導致不一致,什麼不可以)
  3. 絕對什麼都沒有
+0

你的答案和比喻非常好。謝謝你代表其他SO用戶;),給你一個加號...... – Sizons 2016-06-20 12:25:54

3

任務運行爲background threads。因此,當服務停止時,任務將自動停止。您是否需要正式取消該任務取決於該任務是否需要知道它正在退出,以便它可以執行任何必要的清理。

+0

另外,它取決於任務是否可以讓任何東西處於損壞狀態,如果它在中途終止的話。 – 2013-03-01 14:10:15

+0

這就是*任何必要的清理* - 釋放非託管資源,關閉文件,關閉數據庫連接等。 – 2013-03-01 14:12:42

+1

數據一致性不僅僅是資源清理。例如,該任務可能會將項目從一個數據庫移動到另一個數據庫。 (1)打開數據庫連接,刪除項目,關閉數據庫連接。 (2)打開第二個數據庫,添加項目,關閉數據庫連接。在(1)和(2)之間,所有資源都被清除,但是您的數據已損壞(丟失了一個項目)。 – 2013-03-01 14:16:14

相關問題