如何在 .Net Core 中使用 IHostedService

在我们应用程序中常常会有一些执行后台任务和任务调度的需求,那如何在 ASP.Net Core 中实现呢?可以利用 Azure WebJobs 或者其他一些第三方任务调度框架,如:QuartzHangfire

在 ASP.Net Core 中,也可以将 后台任务 作为托管服务的模式,所谓的 托管服务 只需要实现框架中的 IHostedService 接口并囊括进你需要的业务逻辑作为后台任务,这篇文章将会讨论如何在 ASP.Net Core 中构建托管服务。

创建托管服务

要想创建托管服务,只需要实现 IHostedService 接口即可,下面就是 IHostedService 接口的声明。


public interface IHostedService
{Task StartAsync(CancellationToken cancellationToken);Task StopAsync(CancellationToken cancellationToken);
}

这一节中我们在 ASP.Net Core 中做一个极简版的 托管服务, 首先自定义一个 MyFirstHostedService 托管类,代码如下:

public class MyFirstHostedService : IHostedService{protected async override Task ExecuteAsync(CancellationToken token){throw new NotImplementedException();}}

创建 BackgroundService

有一点要注意,上一节的 MyFirstHostedService 实现了 IHostedService 接口,实际开发中并不需要这样做,因为 .Net Core 中已经提供了抽象类 BackgroundService,所以接下来重写抽象类的 ExecuteAsync 方法即可,如下代码所示:

public class MyFirstHostedService : BackgroundService{protected async override Task ExecuteAsync(CancellationToken token){throw new NotImplementedException();}}

下面的代码片段展示了一个简单的 Log 方法,用于记录当前时间到文件中,这个方法由 托管服务 触发。

private async Task Log(){using (StreamWriter sw = new StreamWriter(@"D:\log.txt",true)){await sw.WriteLineAsync(DateTime.Now.ToLongTimeString());}}

使用 ExecuteAsync 方法

接下来看看如何实现 ExecuteAsync 方法,这个方法的逻辑就是周期性(second/s)的调用 Log() 方法,如下代码所示:

protected async override Task ExecuteAsync(CancellationToken token){while (!token.IsCancellationRequested){await Log();await Task.Delay(1000, token);}}

好了,下面是完整的 MyFirstHostedService 类代码,仅供参考。


using Microsoft.Extensions.Hosting;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace HostedServicesApp
{public class MyFirstHostedService : BackgroundService{protected async override Task ExecuteAsync(CancellationToken token){while (!token.IsCancellationRequested){await Log();await Task.Delay(1000, token);}}private async Task Log(){using (StreamWriter sw = new StreamWriter(@"D:\log.txt",true)){await sw.WriteLineAsync(DateTime.Now.ToLongTimeString());}}}  
}

托管服务注册

托管服务类已经写好了,要想注入到 Asp.NET Core 中,需要在 Startup.ConfigureServices 中将 托管服务类 注入到 ServiceCollection 中,如下代码所示:

public void ConfigureServices(IServiceCollection services){services.AddHostedService<MyFirstHostedService>();services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);} 

当把应用程序跑起来后,你会看见程序每秒都会往  D:\log.txt 文件中记录日志。

在 IHostedService 中提供的 StartAsyncStopAsync 可用于在 ASP.NET Core 中执行或停止后台任务,你可以用它在你的应用程序中更新数据或其他操作,还有这些周期性业务逻辑是跑在后台线程中的,这样就不会导致主请求线程的阻塞。

译文链接:https://www.infoworld.com/article/3390741/how-to-use-ihostedservice-in-aspnet-core.html

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

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

相关文章

提高计算机软件速度的方法,小白看过来!提高电脑速度8种实用方法

当电脑使用一段时间之后&#xff0c;常常会遇到运行速度逐渐变缓的情况&#xff0c;甚至卡顿死机&#xff0c;非常影响体验。那么有什么办法可以快速便捷的提高电脑运行速度呢?下面就教你8种办法&#xff0c;让电脑恢复飞速运行状态。1.关闭自动更新电脑总是自动更新&#xff…

网管笔记(1)8.22

8 月 22号,第一天实习,早上因为没有估算好时间所以迟到了点,从我住的地方到网吧,至少要半个小时,8点到,7点钟一定要准时起床.坚持也只有着几天的试用期.网吧出现的问题和解决的方法:一部分机器,在进入系统的时候,会出现读秒,从1到100,然后又跳下来,重新读.不知道原因, …

C# Task 循环任务_C# Task.Run调用外部参数

首先讲一下&#xff1a;c# Task启动带参数和返回值的方法&#xff1a;Task启动带参数Task.Run(() > test("123"));public void Test(string s){...todo..}Task启动带参数和返回值的方法var s Task.Run(() > isTest("ss"));var t s.Result;private …

如何向K8s,Docker-Compose注入镜像Tag

最近在做基于容器的CI/CD, 一个朴素的自动部署的思路是&#xff1a;从Git Repo打出git tag&#xff0c;作为镜像Tagssh远程登录到部署机器向部署环境注入镜像Tag&#xff0c;拉取镜像&#xff0c;重新部署下面分享我是如何在K8s、docker-compose中注入镜像Tag&#xff1f;k8s熟…

东北大学计算机 大一物理考试题,东北大学大学物理期末考题及答案Word版

《东北大学大学物理期末考题及答案Word版》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《东北大学大学物理期末考题及答案Word版(5页珍藏版)》请在人人文库网上搜索。1、传播优秀Word版文档 &#xff0c;希望对您有帮助&#xff0c;可双击去除&#xff01;东北大学物…

showModalDialog()、showModelessDialog()方法使用详解

一、showModalDialog和showModelessDialog有什么不同&#xff1f;   showModalDialog&#xff1a;被打开后就会始终保持输入焦点。除非对话框被关闭&#xff0c;否则用户无法切换到主窗口。类似alert的运行效果。   showModelessDialog&#xff1a;被打开后&#xff0c;用户…

.NET 项目中的单元测试

.NET 项目中的单元测试Intro“不会写单元测试的程序员不是合格的程序员&#xff0c;不写单元测试的程序员不是优秀的工程师。”—— 一只想要成为一个优秀程序员的渣逼程序猿。那么问题来了&#xff0c;什么是单元测试&#xff0c;如何做单元测试。单元测试单元测试的定义按照维…

职称计算机还用考试,职称计算机考试注意事项

职称计算机考试注意事项一、注意事项首先&#xff0c;由于考试是模块化设计&#xff0c;所以在报考时要选择自己熟悉的科目。切忌好高骛远&#xff0c;选择那些自己日常使用机会不多、并无把握的科目。许多人在考试时选择了自己工作中最常用的Windows XP、Word 2003、PowerPoin…

休假2周

又一次辞职了 :(这次的原因是觉得之前的公司无论在数据量还是流量及其它方面都过于小了&#xff0c;而且所谓的‘股份’也是一种看不见的东西&#xff0c;公司也没有上市&#xff0c;分红也是老板说了算&#xff0c;我也决定不了什么&#xff1b;其他的原因就是在一些人际、行政…

python安装地是什么_如何安装python

展开全部 Python是跨平台的&#xff0c;可以运行在2113Windows、Mac和各种Linux/Unix系统上5261。在Windows上写Python程序&#xff0c;放到Linux上也是能够4102运行的。 要开始学习1653Python编程&#xff0c;首先就得把Python安装到电脑里。安装后&#xff0c;会得到Python解…

ABP vNext 实现租户Id自动赋值插入

背景在使用ABP vNext过程中&#xff0c;因为我们的用户体系庞大&#xff0c;所以一直与其他业务同时开发&#xff0c;在开发其他业务模块时&#xff0c;我们一直存在着误区&#xff1a;认为ABP vNext 自动处理了数据新增时的租户Id&#xff08;TenantId&#xff09;的自动赋值插…

solaris 命令

一.chmod 命令 chmod用于改变文件或目录的访问权限。用户用它控制文件或目录的访问权限。该命令有两种用法。一种是包含字母和操作符表达式的文字设定法&#xff1b;另一种是包含数字的数字设定法。 1. 文字设定法 命令中各选项的含义为&#xff1a; 在一个命令行中可给出多…

计算机组成与结构PLA,计算机组成与结构.doc

《》教学大纲安徽大学 计算机 学院二OO六年 4 月《计算机组成与结构》是计算机科学与技术、软件工程专业的一门主干课程&#xff0c;本课程以冯&#xff0e;诺依曼计算机模型作为教学起点&#xff0c;介绍计算机的组织结构和工作原理&#xff0c;剖析计算机的运算器、存储器、控…

深入研究.NET 5的开放式遥测

OpenTelemetry 介绍OpenTelemetry是一种开放的源代码规范&#xff0c;工具和SDK&#xff0c;用于检测&#xff0c;生成&#xff0c;收集和导出遥测数据&#xff08;指标&#xff0c;日志和跟踪&#xff09;,开放遥测技术得到了Cloud Native Computing Foundation&#xff08;CN…

python编写程序计算1+2+3+......+100和_Python3:计算两个列表总和为100的所有排列的最有效方法是什么?...

优化这种方法的方法不是找出更快的方式来生成排列&#xff0c;而是生成尽可能少的排列。 首先&#xff0c;如果您只想要按排序顺序的组合&#xff0c;您将如何做到这一点&#xff1f; 您不需要生成0到100的所有可能组合&#xff0c;然后对其进行过滤。第一个数字a可以是0到100之…

登陆xp系统,无法显示桌面

症状登录到 Windows xp 后&#xff0c;可能会看到空白桌面或看不到桌面。出现这种情况时&#xff0c;可以按下 CtrlAltDelete 键启动任务管理器&#xff0c;但正在运行的任务或进程列表中却没有列出 Explorer.exe。启动 Explorer.exe 的新实例也无法解决问题。 原因…

孕妇可以在计算机教室待吗,电脑对孕妇有辐射吗?孕妇使用电脑的注意事项

怀孕期间孕妇使用电脑有电磁辐射吗&#xff1f;孕妇当然可以使用电脑&#xff0c;经科学研究发现在电脑前工作对孕妇不会产生什么影响&#xff01;孕妇既然是特别保护对象&#xff0c;那么怀孕妈妈在使用电脑时也会有一些注意事项。第一宝宝小编为准妈妈搜集了十二条注意事项。…

python类和函数_构建程序. Python中的类和函数

如果希望mainfunc的所有实例都使用相同的KeySeq对象,则可以使用默认参数值技巧&#xff1a; def mainfunc(ksKeySeq()): key ks.next() 只要您实际上没有传递ks值,对mainfunc的所有调用都将使用在定义函数时创建的KeySeq实例. 如果您不知道,这就是为什么&#xff1a;函数是一个…

CCDP-思科认证网络设计高级工程师

CCDP是Cisco售前设计支持工程师的最高级认证。获得CCDP认证证书应能够运用应具有的网络知识、对设备安装、配置和操作技巧对复杂的LAN、WAN和交换式局域网进行设计。 CCDP认证必备条件必须先获取CCNA和CCDA证书CCDP考试642-801 BSCI 642-811 BCMSN 642-871 ARCH CCDP 重新认证C…

.NET5实战千万并发,性能碾压各版本,云原生时代,.NET5为王!

在移动互联网时代掉队的.NET&#xff0c;当下正凭借着.NET5的开源跨平台以及容器友好&#xff0c;在云原生时代正在重铸辉煌。而作为.NET开发者&#xff0c;新年跳槽季的高并发问题会更多了&#xff0c;因为高并发能牵扯出太多问题&#xff0c;接口响应超时、CPU负载升高、GC频…