2013-03-01 26 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

相关问题