查看原文
其他

.NET Core3.1和WorkerServices构建Windows服务

DotNet 2021-09-23

(给DotNet加星标,提升.Net技能

转自:HueiFeng
cnblogs.com/yyfh/p/12159091.html

介绍


ASP.NET Core 3增加了一个非常有意思的功能Worker Service.他是一个ASP.NET Core模板,他允许我们创建托管长期的运行的后台服务,


这些服务具体实现IHostedService接口的后台任务逻辑,他被成为"托管服务".同时他们可以部署到windows中Windows服务,以及Linux守护程序.


创建一个托管服务


我们通过命令行界面中的dotnet new 命令。通过如下代码创建一个名为customWorker的WorkerService的应用。


dotnet new worker -o customWorker


Program.cs:


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


BackgroundService是实现了IHostedService的基类.调用 ExecuteAsync(CancellationToken) 来运行后台服务。实现返回一个Task,其表示后台服务整个生存期.在 ExeuteAsync(例如通过调用await)之前,不会启动任何其他服务.避免在ExecuteAsync中执行长时间的阻塞初始化. StopAsync(CancellationToekn) 中的主机块等待完成ExecuteAsync。


调用 IHostedService.StopAsync 时,将触发取消令牌。当激发取消令牌以便正常关闭服务时,ExecuteAsync 的实现应立即完成。否则,服务将在关闭超时后不正常关闭。


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模板



在IHostBuilder使用UseWindowsService扩展方法


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服务了。


发布方式


  • 使用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


在Linux设置守护程序


添加Microsoft.Extensions.Hosting.Systemd NuGet软件包



将UseSystemd()添加上。


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


在Linux上设置为守护程序。


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


推荐阅读  点击标题可跳转

Wireshark抓包,带你快速入门

ASP.NET Core 中间件的几种实现方式

ASP.NET Core中使用ModelConvention实现全局过滤器隔离  


看完本文有收获?请转发分享给更多人

关注「DotNet」加星标,提升.Net技能 

好文章,我在看❤️

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存