.NET Core 3.1和WorkerServices構建Windows服務

介紹

ASP.NET Core 3增長了一個很是有意思的功能Worker Service.他是一個ASP.NET Core模板,他容許咱們建立託管長期的運行的後臺服務,這些服務具體實現IHostedService接口的後臺任務邏輯,他被成爲"託管服務".同時他們能夠部署到windows中Windows服務,以及Linux守護程序.git

建立一個託管服務

咱們經過命令行界面中的dotnet new 命令。經過以下代碼建立一個名爲customWorker的WorkerService的應用。github

dotnet new worker -o customWorker

Program.cs:windows

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace WorkerServiceDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                });
    }
}

Worker:bash

BackgroundService是實現了IHostedService的基類.調用 ExecuteAsync(CancellationToken) 來運行後臺服務。實現返回一個Task,其表示後臺服務整個生存期.在 ExeuteAsync(例如經過調用await)以前,不會啓動任何其餘服務.避免在ExecuteAsync中執行長時間的阻塞初始化. StopAsync(CancellationToekn) 中的主機塊等待完成ExecuteAsyncasync

調用 IHostedService.StopAsync 時,將觸發取消令牌。 當激發取消令牌以便正常關閉服務時,ExecuteAsync 的實現應當即完成。 不然,服務將在關閉超時後不正常關閉。ide

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace WorkerServiceDemo
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        public override async Task StartAsync(CancellationToken cancellationToken)
        {
            await base.StartAsync(cancellationToken);
        }

        public override async Task StopAsync(CancellationToken cancellationToken)
        {
            await base.StopAsync(cancellationToken);
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            while (!stoppingToken.IsCancellationRequested)
            {
                _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
                await Task.Delay(1000, stoppingToken);
            }
        }

        public override void Dispose()
        {
        }
    }
}

已使用AddHostedService擴展方法在 IHostBuilder.ConfigureServices(Program.cs)中註冊該服務。工具

services.AddHostedService<Worker>();

WorkerServices部署到Windows服務

安裝 WorkerServices模板visual-studio

在IHostBuilder使用UseWindowsService擴展方法ui

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;


namespace WorkerServiceDemo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args)
        {
            return Host.CreateDefaultBuilder(args)
               
                .ConfigureServices((hostContext, services) =>
                {
                    services.AddHostedService<Worker>();
                }).UseWindowsService(); ;

        }
    }
}

如今咱們能夠部署咱們的windows服務了。spa

發佈方式

  • 使用sc.exe工具
  • 直接部署exe文件

發佈Windows服務

dotnet restore
dotnet publish

sc.exe部署

sc.exe create DemoWorker binpath= publish\xxxx.exe
sc.exe start WorkerServicesName

部署exe文件

WorkerServicesName.exe install
WorkerServicesName.exe start

使用sc.exe中止和刪除

sc.exe stop WorkerServicesName 
sc.exe delete WorkerServicesName

非sc.exe中止和刪除

WorkerServicesName stop  
WorkerServicesName uninstall

Reference

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/windows-service?view=aspnetcore-3.1&tabs=visual-studio

https://github.com/hueifeng/BlogSample/tree/master/src/WorkerServiceDemo

相關文章
相關標籤/搜索