.NET Core 3.1和WorkerServices构建Windows服务

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();        }    }}

.NET Core 3.1和WorkerServices构建Windows服务

现在可以部署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();}

.NET Core 3.1和WorkerServices构建Windows服务

在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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
如何查询mysql语句
上一篇 2026年9月7日 01:24:48
磁盘显示怎么打开 win11系统磁盘显示打开方法教程
下一篇 2025年11月29日 05:13:05

相关推荐

  • Vue3中如何实现checkbox-group多选框初始化选中状态与后端数据和输入框值的同步?

    Vue3 中 checkbox-group 组件初始化选中状态与后端数据及输入框值的同步 本文探讨如何在 Vue3 中使用 checkbox-group 组件,实现多选框的初始化选中状态与后端返回的数据以及对应的输入框值和状态同步。 解决方案:组合式 API 和 Axios 以下代码示例演示如何使用…

    2026年9月7日
    200
  • RAR解压临时文件夹设置方法

    RAR解压临时文件夹设置方法RAR解压临时文件夹设置方法RAR解压临时文件夹设置方法RAR解压临时文件夹设置方法

    启动WinRAR软件 在界面顶部菜单栏中选择“选项”按钮 进入“设置”窗口后,切换到“路径”选项卡 找到“临时文件解压位置”或类似描述的选项,点击其后的“浏览”按钮 在弹出的文件夹选择窗口中,挑选你希望作为临时解压目录的文件夹 确认选择后点击“确定”,完成自定义临时文件夹的设置 以上就是RAR解压临…

    2026年9月7日 用户投稿
    000
  • 大批

    Java数组是存储同类型多个值的便捷方式,它们基于索引,方便数据管理。本文介绍Java数组的基本操作。 一、数组声明与创建 声明数组使用以下语法: type[] arrayName; 其中type是数组元素的数据类型(例如int,String),arrayName是数组名称。 注意:声明仅定义数组的…

    2026年9月7日
    100
  • VCS博客

    版本控制:高效协作的利器 版本控制系统(VCS)是追踪文件随时间变化的软件工具,它能显著提升开发团队的协作效率。 集中式版本控制系统 (CVC): 这类系统将项目所有版本存储于服务器端的单一中心位置。开发者需从中心位置获取代码,完成修改后再提交回中心。 示例: Subversion、Perforce…

    2026年9月7日
    100
  • Win7取消拨号连接的方法

    Win7取消拨号连接的方法Win7取消拨号连接的方法Win7取消拨号连接的方法Win7取消拨号连接的方法

    在日常使用电脑的过程中,我们常常会遇到一些小问题,比如有时候会出现“拨号连接”提示的情况。因此,今天我们就来聊聊如何在win7系统中取消这个“拨号连接”的方法,这样大家在碰到类似问题时就能自行解决了。 各位小伙伴,在上网的时候有没有遇到过这样的情况呢?有时会突然弹出宽带拨号连接的窗口,而且无法关闭它…

    2026年9月7日 用户投稿
    000
  • linux配置静态ip地址上外网的实例讲解

    linux配置静态ip地址上外网的实例讲解linux配置静态ip地址上外网的实例讲解linux配置静态ip地址上外网的实例讲解linux配置静态ip地址上外网的实例讲解

    1、查看网络 # ifconfig 发现网络还没有配置,ping不通 2、修改网卡配置文件 # vim /etc/sysconfig/network-scripts/ifcfg-eth0 添加如下配置:  ONBOOT=yes BOOTPROTO=static IPADDR=IP地址 NETMASK…

    2026年9月7日 用户投稿
    500
  • 文本超出两行如何自动展开并显示“展开”按钮?

    让文本超出两行自动展开,并显示“展开”按钮的技巧 本文介绍如何使用CSS和JavaScript实现文本超出两行时自动展开,并添加“展开”按钮的功能。 首先,利用CSS控制文本显示行数,并隐藏超出部分: .text-container { display: -webkit-box; -webkit-l…

    2026年9月7日
    000
  • 驱动人生怎么进行驱动下载?驱动人生进行驱动下载的正确流程

    打开驱动人生软件后,它会自动扫描硬件并列出需更新的驱动;2. 查看“待更新”或“异常”状态的驱动,选择“一键更新”或手动点击特定驱动的“升级”按钮;3. 下载完成后软件自动安装,部分驱动需重启电脑生效;4. 推荐驱动通常可靠,但未必最佳,应结合版本日期、更新日志判断,优先考虑官方驱动;5. 若驱动人…

    2026年9月7日
    000
  • PDF转Word怎么转带宏的文件_PDF带宏文件转Word的注意事项

    转换带宏的PDF至Word需注意宏无法直接保留。一、使用支持宏的工具如Adobe Acrobat Pro导出为.docm并启用宏;二、因PDF不原生支持宏,需手动在Word中重建VBA代码并保存为.docm格式;三、通过XPS等中间格式中转,利用开发库提取交互逻辑并迁移到Word宏模块,确保功能一致…

    2026年9月7日
    200
  • Windows 11任务管理器引入诸多快捷方式:不用鼠标也能操作

    在今日发布的 Windows 11 Build 22598 测试版本更新中,微软对任务管理器的功能进行了多项优化,使其更加便捷易用。借助新增的快捷键组合,用户可以无需依赖鼠标完成多种操作。例如,按住 Alt + N 即可启动新任务,而 Alt + E 能够迅速终止选定任务。此外,微软还添加了 Alt…

    2026年9月7日
    000
  • 了解Java中的协方差和逆向

    java协变与逆变详解:提升泛型编程能力 1. Java协变 协变允许将派生类型赋值给基类型。简单来说,泛型类型在处理子类型时保持赋值兼容性。这在Java数组和泛型中常见。 示例: class Animal { void sound() { System.out.println(“Animal so…

    2026年9月7日
    000
  • Java中的数据结构(四):时间轮

    一、前言 在最近学习elastic-job和xxl-job(一个分布式作业调用中间件)时,我接触到一个有趣的数据结构:时间轮。不仅是xxl-job,在许多任务调度中间件或涉及延迟/定时任务的场景中,都能看到时间轮的应用。那么,为什么时间轮在这些时间调度相关的场景中如此受欢迎呢?让我们一起来探究其中的…

    2026年9月7日
    100
  • 168.1.253的管理员账号密码忘记了怎么解决?

    忘记168.1.253对应设备的管理员密码时,最直接有效的方法是进行恢复出厂设置,通过按住设备上的reset按钮5到10秒完成复位操作;2. 重置后所有配置将被清除,wi-fi名称和密码恢复为默认,所有已连接设备会掉线,需重新连接,且自定义设置如静态ip、端口转发等需重新配置;3. 除重置外,几乎无…

    2026年9月7日
    000
  • Java用户输入(扫描仪)

    Java用户输入:Scanner类详解 java.util.Scanner 类是 Java 中用于获取用户输入的强大工具。 本示例演示如何使用 Scanner 类读取用户输入,并进行简单的计算。 package afterfeb13;import java.util.Scanner;public c…

    2026年9月7日
    100
  • JSON转换为二进制后,数据量真的会变小吗?

    JSON转二进制:数据量真的会缩小吗? JSON以其易读性和跨平台兼容性而闻名,但其文本格式在存储和传输效率方面并非最佳选择。本文探讨将JSON转换为二进制格式是否会减少数据大小,以及背后的原因。 二进制格式的优势:空间效率 二进制数据使用0和1表示,相比JSON文本字符,占用空间更小。此外,二进制…

    2026年9月6日
    000
  • Linux系统怎么查看版本信息?

    1、输入”uname -a “,可显示电脑以及操作系统的相关信息。 $ uname -aLinux hadoop02.zjl.com 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64…

    用户投稿 2026年9月6日
    000
  • 大麦网官方在线购票平台入口 大麦网演出门票预订中心

    大麦网官方购票平台入口为https://www.damai.cn/,首页分类清晰,支持搜索艺人或演出,个人中心可管理订单与电子票,提供开售提醒功能。平台实行实名制购票、动态二维码验票及风控拦截,保障票务安全。同时支持APP、小程序和网页端多设备协同,实现扫码入场、座位预览与跨端同步。 大麦网官方在线…

    2026年9月6日
    100
  • 那些年我们开发的应用程序

    那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序那些年我们开发的应用程序

    本文主要介绍了使用java和python语言在windows环境下开发的一些应用程序。所有的ui设计都是在无意识状态下创作的,灵感来源于生活。 weatherweather是一款由Java语言开发的天气预报应用程序,数据来源于Yahoo数据库。它支持22个国家的城市天气预报信息。 mp3_v2是一款…

    2026年9月6日 用户投稿
    200
  • Java的注释

    java注释:元数据与代码的桥梁 Java注释并非代码本身,而是为程序提供元数据的辅助信息。它们为JVM和编译器提供关于类、接口、方法和字段的附加数据。 注释语法: @annotationnamepublic class myclass{…} 内置Java注释: 立即学习“Java免费学习笔记(…

    2026年9月6日
    100
  • 怎么给手机获取root权限_手机root权限获取教程(轻松getroot权限)

    嗨,手机玩家们!想让你的手机玩出新花样吗?今天就教你怎么轻松获得root权限,让爱机焕然一新! 前期准备 在踏上root之路之前,记得先做好准备。保证手机电量充足,防止在root过程中因电力不足发生意外。同时,把手机里的关键数据备份一下,毕竟root操作存在一定的风险,以免数据丢失。另外,弄清楚自己…

    2026年9月6日
    000

发表回复

登录后才能评论
关注微信