.NET宝藏API之:IHostedService,后台任务执行
我们在项目开发的过程中可能会遇到类似后台定时任务的需求,比如消息队列的消费者。
按照.NetF
时的开发习惯首先想到的肯定是Windows Service
,拜托,都什么年代了还用Windows服务
(小声bb)
不用 Windows服务
这不是还有Quartz
之流的包嘛,也不是不行,但是随便一点小需求就上这么重的包,是不是有点大材小用了。
除了上面的方案,Task.Run
也不失为一个好方法,方便简单,直接在管道:
Task.Run(() =>
{
while (true)
{
Console.WriteLine("running");
Thread.Sleep(1000);
}
});
Ok,搞定
嗯......也不是不行,总觉得缺了点什么?难道是优雅?
IHostedService
IHostedService
微软给的定义如下,大致的意思就是:定义主机托管对象的方法。
Defines methods for objects that are managed by the host.
下面我们就来实现一下:
public class WorkService : IHostedService, IDisposable
{
private Timer timer;
public void Dispose()
{
timer.Dispose();
}
public Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("start");
timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("end");
timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
private void DoWork(object state)
{
Console.WriteLine("running");
}
}
然后在 ConfigureServices
注册:
services.AddHostedService<WorkService>();
是不是既优雅又 so easy
。
猴:放屁,本来几行代码就能解决的,你这用了这么多行才实现,优雅个屁。
别着急,这不是赠送了两个功能嘛:start
,end
,很划算的啦。
猴:我不要这两个功能,我只要执行任务,你这个就是不行。
得,不要就不要,微软大大都给你准备好了。
BackgroundService
BackgroundService
是微软封装的一个IHostedService
派生类,顾名思义:后台服务嘛,往下看:
public class WorkService : BackgroundService
{
protected async override Task ExecuteAsync(CancellationToken stoppingToken)
{
while(!stoppingToken.IsCancellationRequested)
{
Console.WriteLine("running");
await Task.Delay(1000, stoppingToken);
}
}
}
还是一样的注册:services.AddHostedService<WorkService>();
,运行结果就...还是放一下吧。
这下够优雅了吧。
猴:那还有更优雅的吗?
年轻人,要知足(其实我也不知道了)
因为 BackgroundService
是IHostedService
的派生类,如果你想要使用 start
和end
也是可以的哦。
public override Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("start");
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("end");
return base.StopAsync(cancellationToken);
}
好了,这期的宝藏API
就到这了,下期再见哦,如果有下期的话。
.NET宝藏API之:IHostedService,后台任务执行的更多相关文章
- ASP.NET Web API 过滤器创建、执行过程(二)
ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...
- ASP.NET Web API 过滤器创建、执行过程(一)
ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...
- 在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。
在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态.这些都是计算属性无法做到的.
- .NET宝藏API之:OutputFormatter,格式化输出对象
相信大家在项目中都用过统一响应参数模板. 先声明一个响应模板类: public class ResponseDto { public int code { get; set; } public str ...
- 简单实用后台任务执行框架(Struts2+Spring+AJAX前端web界面可以获取进度)
使用场景: 在平常web开发过程中,有时操作员要做一个后台会运行很长时间的任务(如上传一个大文件到后台处理),而此时前台页面仍需要给用户及时的进度信息反馈,同时还要避免前台页面超时. 框架介绍: 本架 ...
- 数据库程序接口——JDBC——API解读第二篇——执行SQL的核心对象
结构图 核心对象 Statement Statement主要用来执行SQL语句.它执行SQL语句的步骤为: 第一步:创建statement对象. 第二步:配置statement对象,此步骤可以忽略. ...
- 在ASP.NET Web API项目中使用Hangfire实现后台任务处理
当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...
- 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务
[源码下载] 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 前台程序激活后台任务 示例演示后 ...
- .net core 基于 IHostedService 实现定时任务
.net core 基于 IHostedService 实现定时任务 Intro 从 .net core 2.0 开始,开始引入 IHostedService,可以通过 IHostedService ...
随机推荐
- P5018 [NOIP2018 普及组] 对称二叉树
P5018 [NOIP2018 普及组] 对称二叉树 题目 P5018 思路 通过hash值来判断左右树是否相等 \(hl[i]\) 与 \(Hl[i]\) 是防止hash冲突, \(r\) 同理 注 ...
- JavaScript 02 运算符,分支结构
一元换算符 字符串类型 对于字符串,来说自增或自减会自动进行类型转换 1.var str = '10' 自动转换 从string转为number 2.str++ NaN 对于转化不成功的string类 ...
- java == 和 equals
- 为什么以iPhone6为标准的设计稿的尺寸是以750px宽度来设计的呢?
iPhone6的满屏宽度是375px,而iPhone6采用的视网膜屏的物理像素是满屏宽度的2倍,也就是dpr(设备像素比)为2, 并且设计师所用的PS设计软件分辨率和像素关系是1:1.所以为了做出的清 ...
- 如何获取 topic 主题的列表?
bin/kafka-topics.sh --list --zookeeper localhost:2181
- java-等待唤醒机制(线程中的通信)-线程池
为什么需要线程间的通信 多个线程并发执行时,在默认情况下CPU时随机切换线程的,当我们需要多个线程共同完成一件任务,并且 希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共 ...
- Java 中的 LinkedList 是单向链表还是双向链表?
是双向链表,你可以检查 JDK 的源码.在 Eclipse,你可以使用快捷键 Ctrl + T, 直接在编辑器中打开该类.
- CAN总线系列讲座第六讲——SJA1000的滤波器设置
CAN总线的滤波器设置就像给总线上的节点设置了一层过滤网,只有符合要求的CAN信息帧才可以通过,其余的一概滤除. 在验收滤波器的帮助下,只有当接收信息中的识别位和验收滤波器预定义的值相等时,CAN 控 ...
- ip地址与子网掩码概述
IP地址: IP地址(Internet Protocol):IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物理地址的差异. IP地址分为五 ...
- Architecture Review Board
Architecture Review Board What's an Architecture Review? Architecture design is not a one-time final ...