如何安全地停止在Windows服务中运行的C#.NET线程?

Sti*_*imy 13 .net c# windows-services

我正在维护一些看起来像这样的代码.这是一项Windows服务,每隔30分钟就可以完成一些工作.ActualWorkDoneHere方法运行大约需要30秒,但如果在运行时它停止,则会使事情处于错误状态.防止这种情况发生的最佳方法是什么?我应该用onstop方法中设置为false的布尔值替换While(true)(删除线程Abort调用)?有没有办法判断线程是否在睡觉?

namespace WorkService
{
    public partial class WorkService : ServiceBase
    {
        private Thread _workerThread = null;

        public WorkService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {
            _workerThread = new Thread(new ThreadStart(DoWork));
            _workerThread.Start();
        }

        protected override void OnStop()
        {
            _workerThread.Abort();
        }

        static void DoWork()
        {
            int sleepMinutes = 30;

            while (true)
            {
                 ActualWorkDoneHere();

                 System.Threading.Thread.Sleep(new TimeSpan(0, sleepMinutes, 0));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Rog*_*mbe 21

当我有这样的东西时,我通常使用一个ManualResetEvent.这是在Stop()通话中设定的.然后我等待超时:

for (;;)
{
    if (_stop.WaitOne(timeout))
        break;
    DoSomething();
}
Run Code Online (Sandbox Code Playgroud)