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

按照.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. 记一次Prometheus代理性能优化问题

    最近有做一个Prometheus metrics代理的一个小项目,暂称为prom-proxy,目的是为了解析特定的指标(如容器.traefik.istio等指标),然后在原始指标中加入应用ID(当然还 ...

  2. 如何使用docker制作开发集成环境

    1. 编写最基本的Dockerfile 内容:touch 一个Dockerfile FROM ubuntu 2. 创建基本的docker镜像 docker build  -t ubuntu:v1 . ...

  3. Spring Boot 的配置文件有哪几种格式?它们有什么区别?

    .properties 和 .yml,它们的区别主要是书写格式不同.    1).properties    app.user.name = javastack    2).yml    app:   ...

  4. 一个Spring的应用看起来象什么?

    一个定义了一些功能的接口. 这实现包括属性,它的Setter , getter 方法和函数等. Spring AOP. Spring 的XML 配置文件. 使用以上功能的客户端程序.

  5. 初识Spring(为什么要使用Spring?)

    Spring,英文翻译是春天的意思,而在Java中,是一个开放源代码的设计层面框架(手动滑稽,程序员的春天),他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用.S ...

  6. 4.3 ROS工作空间覆盖

    4.3 ROS工作空间覆盖 所谓工作空间覆盖,是指不同工作空间中,存在重名的功能包的情形. ROS 开发中,会自定义工作空间且自定义工作空间可以同时存在多个,可能会出现一种情况: 虽然特定工作空间内的 ...

  7. mplab使用小知识

    选择Debugger->Select Tool->MPLAB SIM可以使用MPALB中的软件调试 StopWatch可以观察程序运行时间 注意:在测试时需要注意红圈内晶振是不是和单片机上 ...

  8. Episode 1:正视微信(试播)

    本期是 WEB VIEW 的第一期播客节目. 「不囿于 WEB,不止于 VIEW」,WEB VIEW 是由 yin 和敬礼主持的一档泛科技播客.节目中我们谨慎考量技术进步所带来的优缺点,提倡用「人治」 ...

  9. 正则系列——JavaScript正则表达式入门心得

    我发现有个别字符被这个编辑器给刷掉了,但是灰色区域显示正常,以灰色区域代码为准 什么玩意? 在我刚开始学习编程的时候,就听过正则了,也听说正则很牛逼,懂正则的更牛逼.但是苦于没有人指点,也没有使用正则 ...

  10. ES6-11学习笔记--Promise

    Promise是ES6异步编程解决方案之一,简化以前ajax的嵌套地狱,增加代码可读性.   基本用法: resolve,成功 reject,失败 let p = new Promise((resol ...