c# - 如何检测何时可以安全升级我的 Windows 服务?

标签 c# azure-devops servicecontroller

我有一个 Windows 服务,可以轮询数据库并根据它找到的记录执行操作。

我想设置 Azure Devops 以自动部署对此服务的升级。

为了部署升级,我需要停止服务。

有什么方法可以判断这是否会中断处理?

在我的发布管道中,我使用命令任务

sc stop MyService

[更新]

这是我的简化代码

static class Program
{
    static void Main()
    {
        ServiceBase.Run(new ServiceBase[] { new Hoster() });
    }
}

  public sealed class Hoster : ServiceBase
{
    private IMyEngine _engine;
    private readonly EventHandler<EngineProgressEventArgs> _progressHandler;
    public Hoster()
    {
            _progressHandler = TrapEngineProgress;
    }

    protected override void OnStart(string[] args)
    {
        try
        {
            _engine = MyFactory.Create();
            _engine.Progress += _progressHandler;
            _engine.StartupEngine();
        }
        catch (Exception ex)
        {
            _logger.Error("OnStart failed", ex);
        }
    }

    protected override void OnStop()
    {
        if (_engine == null) return;
        _engine.Dispose();
        _engine.Progress -= _progressHandler;
        _engine = null;
    }


    private void TrapEngineProgress(object sender, EngineProgressEventArgs e)
    {
        switch (e.Type)
        {
            case ProgressType.Changed:
                Trace("Changed: " + e.Filename);
                break;
            case ProgressType.Created:
                Trace("Created: " + e.Filename);
                break;
            case ProgressType.Trace:
                Trace(e.Message);
                break;
            case ProgressType.Error:
                Error(e.Error, e.Message);
                break;
        }
    }
}

最佳答案

当您发出 SC STOP 命令时,您只是在请求服务自行停止。当服务收到请求时,它可以立即停止或等到它完成重要任务——无论它想做什么。您的服务尽在掌握。

为避免不当中断,您服务的“停止工作流”应如下所示:

  1. 请求停止服务(通过 SC STOP、NET STOP 等)
  2. 服务的“监听线程”收到停止请求
  3. 线程设置已请求停止的标志并将服务的状态设置为 SERVICE_STOP_PENDING
  4. “处理线程”定期检查标志(在方便的时候——可能在作业之间)
  5. 如果设置了标志,则处理循环方便时退出
  6. 由于所有处理都已完成,服务状态设置为 SERVICE_STOPPED,整个服务退出。

通过这种方法,您的服务永远不会在“坏”的地方中断。

关于c# - 如何检测何时可以安全升级我的 Windows 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56487632/

相关文章:

c# - WPF 如果 ViewModel 中的 bool 值为 true,如何跳过动画结束?

azure - 将 Azure 应用服务部署到 URL : 404 + no worker is assigned to the app service plan. 该站点无法处理任何请求

deployment - 使用 Team Foundation Build 2015 部署到多个环境

c# - 通过 GUI 访问 Windows 服务的最佳方式

c# - .NET ServiceController.WaitForStatus 忽略超时

c# - 如何删除两个单词之间的字符串

c# - 在 C# ASP.NET MVC 中的 get 字符串中发送复杂对象数组

c# - 在回传上追加 QueryString?

azure-devops - 是否可以创建 Azure DevOps 组织或项目的备份?

.net - System.ServiceProcess.ServiceController.Stop() 是同步还是异步?