我们在项目开发的过程中可能会遇到类似后台定时任务的需求,比如消息队列的消费者。

按照.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

猴:放屁,本来几行代码就能解决的,你这用了这么多行才实现,优雅个屁。

别着急,这不是赠送了两个功能嘛:startend,很划算的啦。

猴:我不要这两个功能,我只要执行任务,你这个就是不行。

得,不要就不要,微软大大都给你准备好了。

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>();,运行结果就...还是放一下吧。

这下够优雅了吧。

猴:那还有更优雅的吗?

年轻人,要知足(其实我也不知道了)

因为 BackgroundServiceIHostedService的派生类,如果你想要使用 startend也是可以的哦。

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,后台任务执行的更多相关文章

  1. ASP.NET Web API 过滤器创建、执行过程(二)

    ASP.NET Web API 过滤器创建.执行过程(二) 前言 前面一篇中讲解了过滤器执行之前的创建,通过实现IFilterProvider注册到当前的HttpConfiguration里的服务容器 ...

  2. ASP.NET Web API 过滤器创建、执行过程(一)

    ASP.NET Web API 过滤器创建.执行过程(一) 前言 在上一篇中我们讲到控制器的执行过程系列,这个系列要搁置一段时间了,因为在控制器执行的过程中包含的信息都是要单独的用一个系列来描述的,就 ...

  3. 在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

    在这个示例中,使用 watch 选项允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态.这些都是计算属性无法做到的.

  4. .NET宝藏API之:OutputFormatter,格式化输出对象

    相信大家在项目中都用过统一响应参数模板. 先声明一个响应模板类: public class ResponseDto { public int code { get; set; } public str ...

  5. 简单实用后台任务执行框架(Struts2+Spring+AJAX前端web界面可以获取进度)

    使用场景: 在平常web开发过程中,有时操作员要做一个后台会运行很长时间的任务(如上传一个大文件到后台处理),而此时前台页面仍需要给用户及时的进度信息反馈,同时还要避免前台页面超时. 框架介绍: 本架 ...

  6. 数据库程序接口——JDBC——API解读第二篇——执行SQL的核心对象

    结构图 核心对象 Statement Statement主要用来执行SQL语句.它执行SQL语句的步骤为: 第一步:创建statement对象. 第二步:配置statement对象,此步骤可以忽略. ...

  7. 在ASP.NET Web API项目中使用Hangfire实现后台任务处理

    当前项目中有这样一个需求:由前端用户的一个操作,需要触发到不同设备的消息推送.由于推送这个具体功能,我们采用了第三方的服务.而这个服务调用有时候可能会有延时,为此,我们希望将消息推送与用户前端操作实现 ...

  8. 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务

    [源码下载] 背水一战 Windows 10 (116) - 后台任务: 前台程序激活后台任务 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 前台程序激活后台任务 示例演示后 ...

  9. .net core 基于 IHostedService 实现定时任务

    .net core 基于 IHostedService 实现定时任务 Intro 从 .net core 2.0 开始,开始引入 IHostedService,可以通过 IHostedService ...

随机推荐

  1. 有关电控制图软件EPLAN的安装,下面有破解版本2.7

    前段时间刚刚接触这一块,就安装个软件老是出问题,所以我通过自己的努力学会啦,来给正要学习EPLAN的同学发福利啦 15:07:48 安装包发放在百度网盘来自取呀  建议安装我勾选的这个哦 链接:htt ...

  2. SolidWorks在一个零件中设置不同的尺寸版本

    问题 比如想设置一系列螺丝的长度,一个一个建零件非常麻烦,希望在一个零件中设置不同的长度尺寸版本 解决 比如想设置不同的拉伸长度,右键拉伸>配置特征 可以生成新配置,设置不同的D1参数,即可生成 ...

  3. BUAA_DS_聊聊链表

    幸福穿着节日的盛装欢迎你. --威廉•莎士比亚<罗密欧与朱丽叶> 1. 说在前面 大家在学数组的时候小脑瓜里有没有这样的疑惑:为什么数组必须是定长的?为什么数组开太长会编译错误?数组越界为 ...

  4. 有序全排列c++实现(递归)

    1 #include <iostream> 2 #include <algorithm> 3 #include <iterator> 4 #include < ...

  5. synchronized是对象锁还是全局锁

    昆昆欧粑粑 2019-02-20 15:09:59 1148 收藏 1分类专栏: java学习 文章标签: synchronized 全局锁 对象锁 同步版权都可以锁!synchronized(thi ...

  6. Gradle Gretty进行runAppDebug的Listening for transport dt_socket at address: 5005 的后续配置

    出现 Listening for transport dt_socket at address: 5005:代表debug端口已启动好了,接下来你需要进行配置远程Debug,进行附加Debug进程: ...

  7. XML的解析方式有哪几种?有什么区别?

    有DOM.SAX等. DOM:(Document Object Model, 即文档对象模型) 是 W3C 组织推荐的处理 XML 的一种标准方式. DOM中的核心概念就是节点.DOM在分析XML文档 ...

  8. WebApplicationContext?

    WebApplicationContext 继承了ApplicationContext  并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题, ...

  9. Oracle入门基础(十三)一一java调用oracle存储过程

    package demo; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultS ...

  10. 学习Git(二)

    常用命令 git add 添加 git status 查看状态 git status -s 状态概览 git diff 对比 git diff --staged 对比暂存区 git commit 提交 ...