新闻中心
C# IHostedService的用法 - 在ASP.NET Core中运行后台任务
IHostedService是ASP.NET Core中用于托管长时间运行后台任务的接口,含StartAsync(启动时执行)和StopAsync(关闭时优雅停止)方法;可通过实现该接口或继承BackgroundService(提供ExecuteAsync抽象方法)来创建定时任务、消息队列处理等服务,并需用AddHostedService注册以确保生命周期由主机管理。

在 ASP.NET Core 中,如果需要运行长时间运行的后台任务,比如定时处理数据、轮询数据库、发送邮件或维护缓存,IHostedService 是一个非常合适的选择。它允许你在应用启动和关闭时执行自定义逻辑,非常适合托管后台服务。
什么是 IHostedService?
IHostedService 是一个接口,包含两个方法:
- StartAsync(CancellationToken cancellationToken):在应用启动后调用,用于开始后台任务。
- StopAsync(CancellationToken cancellationToken):在应用关闭时调用,用于优雅地停止任务。
你只需实现这个接口,将你的后台逻辑放入其中,ASP.NET Core 会自动管理它的生命周期。
如何使用 IHostedService?
以一个简单的定时任务为例,每 10 秒打印一条日志。
- 创建一个类实现 IHostedService:
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;
public class TimedHostedService : IHostedService
{
private readonly ILogger<TimedHostedService> _logger;
private Timer? _timer;
public TimedHostedService(ILogger<TimedHostedService> logger)
{
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Hosted Service is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
private void DoWork(object? state)
{
if (!_timer!.Disposed)
{
_logger.LogInformation("Timed Hosted Service is working. Time: {Time}", DateTime.Now);
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Hosted Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
}
- 在 Program.cs 中注册服务:
var builder = WebApplication.CreateBuilder(args); // 添加 Hosted Service builder.Services.AddHostedService<TimedHostedService>(); var app = builder.Build(); app.Run();
这样,当应用启动时,StartAsync 被调用,定时器开始工作;关闭时,StopAsync 确保定时器被正确释放。
更复杂的场景:使用 BackgroundService
直接实现 IHostedService 对于复杂任务可能不够方便。ASP.NET Core 提供了抽象类 BackgroundService,更适合长时间运行的任务,比如从队列中消费消息。
版纳武林DIY企业建站系统
系统简介1:安全可靠: 在微软主推的.NET开发平台上,采用业界领先的ASP.NET技术和C#语言开发,不仅安全可靠,并能保证系统的高性能运行。2:简单易用:版纳武林DIY企业建站系统真正做到以人为本、以用户体验为中心,能使您快速搭建您的网站。后台管理操作简单,一目了然,没有夹杂多余的功能和广告。3:布局易改:版纳武林DIY企业建站系统采用的是博客形式的风格管理,让您真正感受到我的地盘听我的.4:
0
查看详情
using Microsoft.Extensions.Hosting;
using System.Threading.Channels;
public class QueuedHostedService : BackgroundService
{
private readonly ChannelReader<string> _reader;
public QueuedHostedService(Channel<string> channel)
{
_reader = channel.Reader;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await foreach (var message in _reader.ReadAllAsync(stoppingToken))
{
Console.WriteLine($"Processing message: {message}");
await Task.Delay(1000, stoppingToken); // 模拟处理耗时
}
}
}
BackgroundService 内部实现了 IHostedService,并提供了一个抽象的 ExecuteAsync 方法,你可以在这里写主循环逻辑,避免手动管理 CancellationToken 和循环。
注册和依赖注入
所有实现 IHostedService 或继承 BackgroundService 的类都会被当作单例处理。它们可以在构造函数中注入任何已注册的服务,如 ILogger、DbContext 或自定义服务。
确保在 builder.Services 中使用 AddHostedService
基本上就这些。用好 IHostedService,可以让后台任务与应用共存亡,既可靠又易于维护。
以上就是C# IHostedService的用法 - 在ASP.NET Core中运行后台任务的详细内容,更多请关注其它相关文章!
# 的是
# 汽车配件网站seo优化费用
# 本地网站推广哪家好做呢
# 东莞关键词排名搜索优化
# 惠民营销推广
# 温州网站建设地方
# 关键词手机排名规
# 沈阳正规关键词排名价格
# seo 栏目描述
# 梁平县网站推广sem
# 如何寻找seo网站建设客户
# 是一个
# 新特性
# app
# 游戏开发
# 启动时
# 自定义
# 有哪些
# 长时间
# 你在
# 建站系统
# .net
# c#
# microsoft
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
解决移动端滚动问题的overflow属性应用指南
在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南
必由学登录入口 必由学官方网站在线访问链接
c++ 命名空间怎么用 c++ namespace使用指南
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
解决Python单元测试中Mock异常方法调用计数为零的问题
解决 Vaadin 8 中大文件音频播放与定位时出现的 IOException
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
新三国志曹操传110级星符试炼夏侯渊极难攻略
一加 14R 快充无反应_一加 14R 充电优化
照顾宝贝2小游戏免费秒玩入口
解决J*aScript中重复选择项的确认对话框显示问题
Lar*el Form Request中唯一性验证在更新操作中的正确实现
163邮箱网页版入口导航平台 163邮箱网页版登录入口官网导航
外媒分析《GTA6》定价:卖100美元可以但真没必要!
AI泡沫首次被“刺破”:GPU十年都无法存活!
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
特斯拉自动驾驶房车计划曝光 原型车将于2027年亮相
uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页
J*aScript中管理异步API调用:确保操作顺序与数据一致性
如何在 Excel Online 和 Google 表格中更改日期格式
从J*aScript对象中精确提取指定属性的教程
Typer应用中灵活处理命令行参数的令牌化与解析
126邮箱手机版登录官网2026_126手机邮箱免费入口最新
如何使 Jest 模拟函数默认抛出错误以提高测试效率
抖音极速版最新版本 抖音极速版官方下载地址
QQ邮箱官方邮箱登录入口 QQ邮箱网页版快速访问
地铁跑酷免费秒玩入口链接 地铁跑酷小游戏免费秒玩网站
Composer的 "conflict" 字段有什么用_如何声明不兼容的包以避免依赖冲突
纯CSS与HTML网格布局的HTML精简策略:SVG与JS方案解析
windows10怎么关闭系统提示音_windows10彻底静音设置方法
必由学官方平台入口 必由学在线课堂登录地址
J*aScript异步迭代器_j*ascript异步遍历
qq音乐在线播放入口_qq音乐电脑版登录链接
新手怎么开始学化妆 零基础化妆入门教程
在Go Martini框架中高效服务动态生成图像的实践指南
AO3最新入口2025公告_AO3中文官网合集
Python实现多节点属性重叠度分析教程
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
163邮箱注册官网 免费申请163个人邮箱
poki网页游戏推荐_poki免费游戏平台入口
夸克浏览器网页版最新地址 夸克浏览器官方入口合集
Golang如何实现Web文件静态资源服务器_Golang静态资源服务器开发与实践
MAC怎么安装Homebrew包管理器_MAC为开发者和高级用户安装命令行工具
微博网页版官方账号登录 微博网页版内容浏览使用指南
漫蛙2正版漫画站 漫蛙2网页版快速访问入口
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧
J*aScript生成器_j*ascript异步迭代
C++如何实现异步操作_C++11使用std::future和std::async进行异步编程


2025-12-04
浏览次数:次
返回列表
_logger = logger;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Hosted Service is starting.");
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(10));
return Task.CompletedTask;
}
private void DoWork(object? state)
{
if (!_timer!.Disposed)
{
_logger.LogInformation("Timed Hosted Service is working. Time: {Time}", DateTime.Now);
}
}
public Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("Timed Hosted Service is stopping.");
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
}