我是否需要在OnStop方法中终止Windows服务中的任务?

时间:2013-03-01 13:56:37

标签: c# windows-services task-parallel-library

所以我有一个Windows服务 我在OnStart开始了任务

   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
           }
       }

我是否需要在OnStop中添加CancellationToken并停止任务,否则是不必要的?因为当服务停止时 - 任务也会停止。它安全与否?

2 个答案:

答案 0 :(得分:11)

你以130公里的速度沿着高速公路行驶。 突然间你看到一个叫你停下来的警察。 当你注意到他时你就在A点。 你可以:

  1. 忽略他的命令
  2. 立即停止(在A点)改变车道并在大爆炸时坠毁。
  3. 逐渐但安全地停止,降低车速,最终在B点达到0公里/小时。 B点尽可能接近A点,但必要时尽可能不危及任何人。
  4. 在现实生活中,任何人都会选择3)。 在.NET中,根据应用程序的性质和重要性,您也可以选择1)或2)。

    取决于您是否想要冒险:

    1. 被警察追捕(被任务经理杀害)
    2. 崩溃(松散的重要数据或导致不一致,什么不是)
    3. 绝对没有

答案 1 :(得分:3)

任务以background threads运行。因此,当服务停止时,任务将自动停止。是否需要正式取消任务取决于任务是否需要知道它是否正在退出,以便它可以执行任何必要的清理。