.NET Core 3.1和WorkerServices构建Windows服务
介绍
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
Reference
https://github.com/hueifeng/BlogSample/tree/master/src/WorkerServiceDemo
- .Net Core 项目在Windows服务中托管【转载】
- 构建企业服务之windows 2008 CA证书服务器部署 推荐
- Quartz.Net 学习随手记之04 构建Windows Service承载服务
- “Windows Media Services服务因2147500037(0x80004005)服务性错误而停止”的解决方法
- 以Windows服务方式运行.NET Core程序
- NSSM部署.Net Core到 Windows 服务
- 构建企业服务之windows 2008 负载均衡服务器部署 推荐
- WCF:为 SharePoint 2010 Business Connectivity Services 构建 WCF Web 服务(第 1 部分,共 4 部分)
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(上)
- C#创建Windows服务(Windows Services) 实战之系统定时重启服务
- .Net Core 商城微服务项目系列(十四):分布式部署携程Apollo构建配置中心
- C# 6 与 .NET Core 1.0 高级编程 - 39 章 Windows 服务(下)
- Windows 注册 Services 服务的方法
- C# Windows Services 服务
- windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)
- C# windows服务:创建Windows服务(Windows Services)的一般步骤
- windows&mac 的web服务 IIS-internet information services&apchectl 内网穿透服务
- C#写的服务出现错误:Windows could not start the NLServices sercice on local Computer. Error 1083:The executable programe that thi
- 使用Topshelf组件构建简单的Windows服务
- wxPython-桌面应用 && windows Services 服务