asp.net core 3引入了worker service这一有趣功能。作为一个asp.net core模板,它允许开发者创建托管长期运行的后台服务。这些服务通过实现ihostedservice接口来定义后台任务逻辑,被称为“托管服务”。它们可以部署在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类实现了BackgroundService,这是IHostedService的基类。通过调用ExecuteAsync(CancellationToken)方法来运行后台服务。ExecuteAsync方法返回一个Task,代表后台服务的整个生命周期。在ExecuteAsync方法执行(例如通过await)之前,不会启动其他服务。应避免在ExecuteAsync中进行长时间的阻塞初始化。在StopAsync(CancellationToken)方法中,主机会等待ExecuteAsync完成。
当调用IHostedService.StopAsync时,会触发取消令牌。当取消令牌被激发以便正常关闭服务时,ExecuteAsync的实现应立即完成。否则,服务将在关闭超时后不正常关闭。
Worker类的实现如下:
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 _logger; public Worker(ILogger 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() { } }}
通过在Program.cs的IHostBuilder.ConfigureServices方法中使用AddHostedService扩展方法注册了该服务:
services.AddHostedService();
安装WorkerServices模板后,可以使用UseWindowsService扩展方法在IHostBuilder中配置Windows服务:
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(); }).UseWindowsService(); } }}

现在可以部署Windows服务了。发布方式如下:
dotnet restoredotnet publish
使用sc.exe工具直接部署exe文件发布Windows服务:
sc.exe create DemoWorker binpath= publishxxxx.exesc.exe start WorkerServicesName
部署exe文件:
WorkerServicesName.exe installWorkerServicesName.exe start
使用sc.exe停止和删除服务:
sc.exe stop WorkerServicesNamesc.exe delete WorkerServicesName
非sc.exe停止和删除服务:
WorkerServicesName stopWorkerServicesName uninstall
添加Microsoft.Extensions.Hosting.Systemd NuGet软件包后,可以在IHostBuilder中添加UseSystemd()方法:
public static IHostBuilder CreateHostBuilder(string[] args){ return Host.CreateDefaultBuilder(args) .ConfigureServices((hostContext, services) => { services.AddHostedService(); }).UseSystemd();}

在Linux上设置为守护程序,请参考以下链接:
https://www.php.cn/link/3a3fbf606d98da42ecaf1ed523ee083c
https://www.php.cn/link/2562e666dd1a56d065589ec818bda84c
以上就是.NET Core 3.1和WorkerServices构建Windows服务的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/190449.html
微信扫一扫
支付宝扫一扫