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

标签 c# .net windows-services

我正在维护一些看起来像这样的代码。这是一项 Windows 服务,每 30 分钟执行一些工作。 ActualWorkDoneHere 方法需要大约 30 秒才能运行,但如果它在运行时停止,可能会使事情处于糟糕的状态。防止这种情况发生的最佳方法是什么?我应该用 onstop 方法中设置为 false 的 bool 值替换 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));
            }
        }
    }
}

最佳答案

当我遇到这样的事情时,我通常会使用 ManualResetEvent。这是在 Stop() 调用中设置的。然后我等待超时:

for (;;)
{
    if (_stop.WaitOne(timeout))
        break;
    DoSomething();
}

关于c# - 如何安全地停止在 Windows 服务中运行的 C# .NET 线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1764898/

相关文章:

c# - Jquery 下拉列表值返回未定义

c# - 如何从选定日期获取日期名称?

c# - 如何配置 log4net consoleappender 以根据 Level 写入 Console.Err 和 Console.Out?

c# - 为什么我们同时拥有交错数组和多维数组?

c# - 如何使用 C# 更改 Windows 服务恢复选项

c# - 如何选择正确的 Microsoft.AspNetCore.Authentication 替代方案

c# - 如何将第二个外键添加到已经是复合外键一部分的 EF 属性

.net - 我一直听说有大量的错误跟踪器,但 .net 中构建的却不多

windows-services - 如何从具有管理员权限的 Windows 服务运行程序

c++ - 如何读取 Windows 服务启动的控制台应用程序的输出