.netcore worker service在一个worker里执行多个任务的方法

 最近,有一个项目要使用 Windows 服务,来做为一个软件项目的载体。我想了想,都已经到了跨平台的时代了,会不会有替换 Windows 服务的技术出现呢?于是,在网络上疯狂的搜索了一番,真实皇天不负苦心人,找到了一个答案,那就是 Worker Service。听说在 NET Core 3.0 的时代就新增了 Worker Service 的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成 windows 服务或 linux 守护程序。如果安装的 vs2022 是中文版本,Worker Service 的项目名称就变成了辅助角色服务。 

关于Worker类,既可以写多个,比如 WorkerOne,WorkerTwo 来实现多个任务,也可以在一个Worker类里实现多任务,前者的demo代码如下:

using Furion.TimeCrontab;namespace WorkerServiceTest
{public class Worker : BackgroundService{private readonly ILogger<Worker> _logger;public Worker(ILogger<Worker> logger){_logger = logger;}//重写BackgroundService.StartAsync方法,在开始服务的时候,执行一些处理逻辑,这里我们仅输出一条日志public override async Task StartAsync(CancellationToken cancellationToken){_logger.LogInformation("Worker starting at: {time}", DateTimeOffset.Now);await base.StartAsync(cancellationToken);}/// <summary>/// 第一个 windows服务或linux守护程序 的处理逻辑,由RunTaskOne方法内部启动的Task任务线程进行处理,/// 同样可以从参数CancellationToken stoppingToken中的IsCancellationRequested属性,得知Worker Service服务是否已经被停止/// </summary>/// <param name="stoppingToken"></param>/// <returns></returns>protected async Task RunTaskOne(CancellationToken stoppingToken){var _crontab = Crontab.SecondlyAt(1, 10, 20); // 每秒如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环//while (!stoppingToken.IsCancellationRequested)//{//    await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);//    _logger.LogInformation("RunTaskOne running at: {time}", DateTimeOffset.Now);//    // Thread.Sleep(1000);//}//如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环while (!stoppingToken.IsCancellationRequested){await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);await Task.Run(() =>{_logger.LogInformation("RunTaskOne running at: {time}", DateTimeOffset.Now);}, stoppingToken); }}/// <summary>/// 第二个 windows服务或linux守护程序 的处理逻辑,由RunTaskTwo方法内部启动的Task任务线程进行处理,/// 同样可以从参数CancellationToken stoppingToken中的IsCancellationRequested属性,得知Worker Service服务是否已经被停止/// </summary>/// <param name="stoppingToken"></param>/// <returns></returns>protected async Task RunTaskTwo(CancellationToken stoppingToken){var _crontab = Crontab.SecondlyAt(30, 35, 40); // / 每第 3,5,6 秒如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环//while (!stoppingToken.IsCancellationRequested)//{//    await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);//    _logger.LogInformation("RunTaskTwo running at: {time}", DateTimeOffset.Now);//    // Thread.Sleep(1000);//}//如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环while (!stoppingToken.IsCancellationRequested){await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);await Task.Run(() =>{_logger.LogInformation("RunTaskTwo running at: {time}", DateTimeOffset.Now);}, stoppingToken);}}/// <summary>/// 第三个 windows服务或linux守护程序 的处理逻辑,由RunTaskThree方法内部启动的Task任务线程进行处理,/// 同样可以从参数CancellationToken stoppingToken中的IsCancellationRequested属性,得知Worker Service服务是否已经被停止/// </summary>/// <param name="stoppingToken"></param>/// <returns></returns>protected async Task RunTaskThree(CancellationToken stoppingToken){var _crontab = Crontab.SecondlyAt(45, 50, 55); // / 每第 3,5,6 秒如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环//while (!stoppingToken.IsCancellationRequested)//{//    await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);//    _logger.LogInformation("RunTaskThree running at: {time}", DateTimeOffset.Now);//    // Thread.Sleep(1000);//}//如果服务被停止,那么下面的IsCancellationRequested会返回true,我们就应该结束循环while (!stoppingToken.IsCancellationRequested){await Task.Delay(_crontab.GetSleepTimeSpan(DateTime.Now), stoppingToken);await Task.Run(() =>{_logger.LogInformation("RunTaskThree running at: {time}", DateTimeOffset.Now);}, stoppingToken);}}protected override async Task ExecuteAsync(CancellationToken stoppingToken){//while (!stoppingToken.IsCancellationRequested)//{//    _logger.LogInformation("Worker1 正在进行中 : {time}", DateTimeOffset.Now);//    await Task.Delay(1000, stoppingToken);//}try{RunTaskOne(stoppingToken);RunTaskTwo(stoppingToken);RunTaskThree(stoppingToken);await Task.CompletedTask;// await Task.WhenAll(taskOne, taskTwo, taskThree);//使用await关键字,异步等待RunTaskOne、RunTaskTwo、RunTaskThree方法返回的三个Task对象完成,这样调用ExecuteAsync方法的线程会立即返回,不会卡在这里被阻塞}catch (Exception ex){//RunTaskOne、RunTaskTwo、RunTaskThree方法中,异常捕获后的处理逻辑,这里我们仅输出一条日志_logger.LogError(ex.Message);}finally{//Worker Service服务停止后,如果有需要收尾的逻辑,可以写在这里}}//重写BackgroundService.StopAsync方法,在结束服务的时候,执行一些处理逻辑,这里我们仅输出一条日志public override async Task StopAsync(CancellationToken cancellationToken){_logger.LogInformation("Worker1 停止了 : {time}", DateTimeOffset.Now);await base.StopAsync(cancellationToken);}}
}

其他方法可以参考:

https://www.cnblogs.com/PatrickLiu/p/15834732.html

25. 辅助角色服务 | Furion

26.2 Cron 表达式 | Furion

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95249.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图像拼接后丢失数据,转tiff报错rasterfile failed: an unknown

图像拼接后丢失数据 不仅是数据丢失了&#xff0c;还有个未知原因报错 部分数据存在值不存在的情况 原因 处理遥感数据很容易&#xff0c;磁盘爆满了 解决方案 清理一些无用数据&#xff0c;准备买个2T的外接硬盘用着了。 然后重新做处理

redis高可用(主从复制,哨兵,集群)

目录 一、主从复制&#xff1a; 1.主从复制介绍&#xff1a; 2.主从复制的作用&#xff1a; 3.主从复制流程&#xff1a; 4.搭建Redis 主从复制&#xff1a; 4.1 环境准备&#xff1a; 4.2 安装redis&#xff1a; 4.3 master节点修改 Redis 配置文件&#xff1a; 4.4 slave节点…

Linux学习之悟空派上实现OLED的无线网IP及CPU温度显示【守护进程】

起因 最近各种网购平台似乎都在推送99元的悟空派全志H3的开发板&#xff0c;出于好奇就买了一块来试试水&#xff0c;由于这块板子基本上和orangepi-Zero的硬件结构一模一样&#xff0c;所以设备树、boot这些就用orangepi现成的部件了。 因为本人比较喜欢使用SSH操作&#xff…

Java方法案例

设计一个方法用于遍历数组&#xff0c;要求遍历的结果是在一行上的。例如&#xff1a;[11,22,33,44,55] public class index {public static void main(String[] args) {int[] arr {11,22,33,44,55};printArr(arr);}public static void printArr(int[] arr){System.out.print…

C++——list(2)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年9月28日 内容&#xff1a;C——list内容讲解 目录 前言&#xff1a; list的const迭代器&#xff1a; const的iterator&#xff1a; const迭代器&#xff1a; operator->: 拷贝构造&#xff1a; 迭代器接口补充&…

QT实验之闪烁灯

QT实验之闪烁灯 在QT中&#xff0c;使用QPainter来实现闪烁灯效果的一种方法是使用QTimer来周期性地改变灯的状态。 首先&#xff0c;你需要一个QPixmap对象&#xff0c;它包含了灯的图片。然后&#xff0c;使用QTimer来周期性地切换灯的状态。当灯的状态改变时&#xff0c;你需…

(c语言)位操作符

#include<stdio.h> //位操作符(只针对整数进行操作) //& - 按(二进制)位与 (有0则0) //| - 按(二进制)位或 (有1则1) //^ - 按(二进制)位异或 (不同为1,相同为0) int main() { int a 3; int b -5; //00000000000000000000000000000011——3的补码 …

【408复习】在b站开播通知

从今天开始制作408的讲解课程&#xff0c;欢迎大家来围观&#xff1b; 视频讲解的方式&#xff0c;在b站讲解&#xff0c; 账号&#xff1a;JustinAndCindy 参考书目&#xff1a; 操作系统 《计算机操作系统》第四版 汤小丹 数据结构 《无》 计算机网络 谢希仁 计算机组成原理 …

torch.randn()函数

torch.randn函数是PyTorch中用于生成具有正态分布&#xff08;均值为0&#xff0c;标准差为1&#xff09;的随机数的函数。它可以用于创建具有指定形状的张量&#xff0c;并且张量中的每个元素都是独立的随机数&#xff0c;遵循标准正态分布&#xff08;均值为0&#xff0c;标准…

【LittleXi】【MIT6.S081-2020Fall】Lab: locks

【MIT6.S081-2020Fall】Lab: locks 【MIT6.S081-2020Fall】Lab: locks内存分配实验内存分配实验准备实验目的1. 举一个例子说明修改前的**kernel/kalloc.c**中如果没有锁会导致哪些进程间竞争(races)问题2. 说明修改前的kernel/kalloc.c中锁竞争contention问题及其后果3. 解释a…

Elasticsearch安装访问

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

【云笔记篇】Microsoft OneNote笔记插件推荐OneMore

【云笔记篇】Microsoft OneNote笔记插件推荐OneMore OneMore插件是一款非常强大&#xff0c;多达一百多个扩展功能的OneNote笔记插件&#xff0c;而且免费开源&#xff0c;不断更新的优秀插件—【蘇小沐】 1、实验 【OneMore官网&#xff1a;OneMore - a OneNote add-in (on…

C++——类和对象

文章目录 1.面向过程和面向对象的区别2.类的定义3.类的特点3.1封装性3.2继承性3.3多态性 4.类的访问限定符及封装4.1访问限定符4.2封装 5.类的作用域6.类的实例化7.计算类对象大小8.this指针8.1this指针的引出8.2this指针的特性 9.类的6个默认成员函数9.1默认构造函数9.1.1概念…

Elastic SQL 输入:数据库指标可观测性的通用解决方案

作者&#xff1a;Lalit Satapathy, Ishleen Kaur, Muthukumar Paramasivam Elastic SQL 输入&#xff08;metricbeat 模块和输入包&#xff09;允许用户以灵活的方式对许多支持的数据库执行 SQL 查询&#xff0c;并将结果指标提取到 Elasticsearch。 本博客深入探讨了通用 SQL …

TinyWebServer学习笔记-threadpool

线程池的特点&#xff1a; 空间换时间,浪费服务器的硬件资源,换取运行效率. 池是一组资源的集合,这组资源在服务器启动之初就被完全创建好并初始化,这称为静态资源. 当服务器进入正式运行阶段,开始处理客户请求的时候,如果它需要相关的资源,可以直接从池中获取,无需动态分配.…

单调队列---数据结构与算法

简介 队列也是一种受限制的线性表和栈相类似&#xff0c;栈是先进后出&#xff0c;而队列是先进先出&#xff0c;就好像一没有底的桶&#xff0c;往里面放东西&#xff0c;如图 在这里也是用数组来实现队列&#xff0c;用数组实现的叫做顺序队列 队列的数组模拟 const int N…

学习笔记|ADC反推电源电压|扫描按键(长按循环触发)|课设级实战练习|STC32G单片机视频开发教程(冲哥)|第十八集:ADC实战

文章目录 1.ADC反推电源电压测出Vref引脚电压的意义?手册示例代码分析复写手册代码Tips&#xff1a;乘除法与移位关系为什么4096后面还有L 2.ADC扫描按键(长按循环触发)长按触发的实现 3.实战小练1.初始状态显示 00 - 00 - 00&#xff0c;分别作为时&#xff0c;分&#xff0c…

buuctf-[GXYCTF2019]禁止套娃 git泄露,无参数rce

用dirsearch扫一下&#xff0c;看到flag.php 访问一下没啥东西&#xff0c;使用githack python2 GitHack.py http://8996e81f-a75c-4180-b0ad-226d97ba61b2.node4.buuoj.cn/.git/查看index.php <?php include "flag.php"; echo "flag在哪里呢&#xff1f;…

Net相关的各类开源项目

Net相关的各类开源项目 WPFHandyControlLive-ChartsWPFDeveloperswpf-uidesignStylet WebScheduleMasterYiShaAdminBlog.CoreNebula.AdminNewLife.CubeOpenAuth UnityuGUIUnityCsReferenceEpitomeMyUnityFrameWorkKSFrameworkTowerDefense-GameFramework-Demo 通用ClientServer…