新闻中心
C#的BackgroundService是什么?如何轻松实现长时间运行的后台任务?
BackgroundService是C#中用于创建长时间运行后台任务的抽象基类,位于Microsoft.Extensions.Hosting命名空间下,通过继承它可实现如定时处理消息等循环任务;其核心在于封装IHostedService接口,自动管理StartAsync和StopAsync生命周期,开发者只需重写ExecuteAsync方法编写任务逻辑,并响应CancellationToken以确保优雅关闭;示例中MyBackgroundTask每10秒打印日志,需在Program.cs中通过AddHostedService注册;关键点包括:必须处理取消令牌、避免阻塞调用、妥善捕获异常以防任务意外终止,同时支持依赖注入服务。

BackgroundService 是 C# 中一个抽象基类,位于 Microsoft.Extensions.Hosting 命名空间下,专为创建长时间运行的后台任务服务而设计。它适用于在 .NET Core 或 .NET 5+ 的托管环境中(如 Web 应用、Worker Service)运行循环执行的任务,比如定时处理消息、轮询数据库、发送心跳等。
BackgroundService 的核心作用
它封装了 IHostedService 接口的实现,让你只需关注任务逻辑,而不必手动管理服务的启动和停止生命周期。系统会在应用启动时自动调用 StartAsync,在关闭时优雅地触发 StopAsync,确保资源释放和任务安全退出。
如何轻松实现一个后台任务
下面是一个简单的示例,展示如何继承 BackgroundService 实现每10秒打印一次日志的后台任务:
using Microsoft.Extensions.Hosting; usingMicrosoft.Extensions.Logging; using System.Threading; using System.Threading.Tasks; <p>public class MyBackgroundTask : BackgroundService { private readonly ILogger<MyBackgroundTask> _logger;</p><pre class='brush:php;toolbar:false;'>public MyBackgroundTask(ILogger<MyBackgroundTask> logger) { _logger = logger; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { _logger.LogInformation("后台任务已启动"); while (!stoppingToken.IsCancellationRequested) { try { _logger.LogInformation("正在执行后台任务..."); // 模拟工作 await Task.Delay(10000, stoppingToken); } catch (OperationCanceledException) { // 停止信号触发,正常退出 break; } catch (Exception ex) { _logger.LogError(ex, "后台任务执行出错"); // 可选择等待后再继续 await Task.Delay(5000, CancellationToken.None); } } _logger.LogInformation("后台任务已停止"); }
}
GoEnhance
全能AI视频制作平台:通过GoEnhance AI让视频创作变得比以往任何时候都更简单。
347
查看详情
在项目中注册后台服务
如果你使用的是 Worker Service 或 ASP.NET Core 项目,在 Program.cs 中添加服务注册:
var builder = Host.CreateApplicationBuilder(args); <p>// 添加后台服务 builder.Services.AddHostedService<MyBackgroundTask>();</p><p>var host = builder.Build(); await host.RunAsync();</p>
关键注意事项
- ExecuteAsync 是核心方法:所有逻辑写在这里,必须响应 CancellationToken,避免应用无法正常关闭。
- 异常处理很重要:未捕获的异常可能导致任务终止,建议用 try-catch 包裹循环体。
- 避免阻塞调用:使用 async/await 和非阻塞方法,防止线程挂起。
- 支持依赖注入:构造函数可注入日志、配置、数据库上下文等服务。
基本上就这些。用 BackgroundService 写后台任务不复杂,但容易忽略取消令牌和异常恢复,写的时候多注意这两点就够了。
以上就是C#的BackgroundService是什么?如何轻松实现长时间运行的后台任务?的详细内容,更多请关注其它相关文章!
# 新特性
# 河源网络营销怎么推广
# 龙斗SEO
# 抖音水印推广网站
# 咸宁seo推广公司
# 湖州网站建设推荐
# 贵定企业网站建设
# 苏家屯区创新网站建设
# 长沙网站网络推广平台
# seo源码选择
# 辽宁推广网站路径
# 如果你
# 是一个
# app
# 的是
# 游戏开发
# 只需
# 你在
# 令牌
# 有哪些
# 长时间
# .net
# c#
# nas
# microsoft
# ai
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
Node.js CSV 数据处理:基于字段空值条件过滤整条记录的策略
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
126邮箱账号注册 电脑版登录入口
将HTML动态表格多行数据保存到Google Sheet的教程
12306选座怎么选到特殊座位_12306特殊座位选择注意事项
b站如何看历史记录_b站观看历史找回方法
文心一言怎样用批量生成做多版文案_文心一言用批量生成做多版文案【批量创作】
学习通在线学习平台 学习通网页版直接进入课程中心
解决 MongoDB 聚合查询中对象数组 _id 匹配问题
css卡片内容溢出如何处理_使用overflow隐藏或scroll显示内容
一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证
解决Python logging 中 datefmt 导致时间戳固定不变的问题
PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符
一加手机拍照效果不好怎么办 一加哈苏影像调校与专业模式使用教程【高手篇】
TikTok搜索不到用户发布内容怎么办 TikTok用户内容搜索优化方法
Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁
如何使 Jest 模拟函数默认抛出错误以提高测试效率
提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
PySpark中从现有列右侧提取可变长度字符创建新列的教程
KFC游戏互动怎么赢取优惠券_KFC线上游戏活动参与与优惠代码赢取教程
J*a如何使用AtomicInteger控制计数_J*a无锁计数器性能分析
Win11怎么合并任务栏图标 Win11开启任务栏合并减少图标占空间【方法】
写好的html代码怎么运行出来_运行写好的html代码方法【教程】
蛙漫安全无毒 官方认证的绿色入口
在WordPress中通过REST API获取BasicAuth保护的远程文章
Win11怎么查看电脑配置_Win11硬件配置检测工具使用
vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法
优酷会员付费后没到账怎么办_优酷会员充值异常及解决方法
J*a里如何实现线程安全的懒加载单例_懒加载单例实现方法解析
微信网页版官方快速登录入口 微信网页版网页版账号直达
wps文字怎么插入目录并自动更新_wps文字如何插入目录并自动更新方法
响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配
2025俄罗斯Yandex最新入口 官方网站地址及浏览器下载指南
AO3最新镜像入口 Archive of Our Own官方平台访问
想当下一个《2077》?《心之眼》Steam评价升至"多半好评"
C#中解析不规范的HTML为XML 常见的坑与解决办法
Golang如何测试channel通信行为_Golang channel通信测试与分析方法
冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法
NetBeans Ant项目:自动化将资源文件复制到dist目录的教程
MongoDB聚合管道:正确匹配对象数组中_id的方法
《刺客信条:影》PS5 Pro和Switch 2画面对比
厨房不锈钢水槽发黑生锈怎么处理_水槽用可乐+锡纸2分钟抛亮如新
J*a TimerTask中HashMap意外清空的深层原因与解决方案
ArrayList与LinkedList操作复杂度详解:遍历与修改
学习通网页版官方登录 超星学习通电脑端入口指南
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
为什么我的微信朋友圈看不到别人的更新_微信朋友圈更新显示异常解决方法
4399网页游戏电脑版全新入口 4399电脑端在线玩指南


2025-11-29
浏览次数:次
返回列表
Microsoft.Extensions.Logging;
using System.Threading;
using System.Threading.Tasks;
<p>public class MyBackgroundTask : BackgroundService
{
private readonly ILogger<MyBackgroundTask> _logger;</p><pre class='brush:php;toolbar:false;'>public MyBackgroundTask(ILogger<MyBackgroundTask> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
_logger.LogInformation("后台任务已启动");
while (!stoppingToken.IsCancellationRequested)
{
try
{
_logger.LogInformation("正在执行后台任务...");
// 模拟工作
await Task.Delay(10000, stoppingToken);
}
catch (OperationCanceledException)
{
// 停止信号触发,正常退出
break;
}
catch (Exception ex)
{
_logger.LogError(ex, "后台任务执行出错");
// 可选择等待后再继续
await Task.Delay(5000, CancellationToken.None);
}
}
_logger.LogInformation("后台任务已停止");
}