1

所以我有一个 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 并停止 Task 还是没有必要?因为服务何时停止 - 任务也会停止。它是否安全?

4

2 回答 2

12

你正以每小时 130 公里的速度在高速公路上行驶。突然你看到一个警察告诉你停下来。当您注意到他时,您就处于 A 点。您可以:

  1. 无视他的命令
  2. 立即停止(在 A 点)改变车道并在大爆炸中坠毁。
  3. 逐渐但安全地停车,降低车速,并最终在 B 点达到 0 公里/小时。B 点尽可能靠近 A 点,但在不危及任何人的情况下尽可能靠近。

在现实生活中,任何人都会选择 3)。在 .NET 中,根据应用程序的性质和重要性,您也可以选择 1) 或 2)。

这取决于您是否愿意冒险:

  1. 被警察追捕(被任务管理器杀死)
  2. 崩溃(丢失重要数据或导致不一致等等)
  3. 绝对没有
于 2013-03-01T14:05:06.083 回答
4

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

于 2013-03-01T14:07:16.920 回答