C#怎么配置后台任务 BackgroundService使用方法


BackgroundService 是 ASP.NET Core 中实现长运行托管后台任务的标准方式,需继承并重写 ExecuteAsync,使用 CancellationToken 响应关闭,通过 AddHostedService 注册,支持 DI 但需注意作用域生命周期。

c#怎么配置后台任务 backgroundservice使用方法

在 C#(特别是 .NET 5+ 的 ASP.NET Core 应用中),BackgroundService 是实现**长运行、托管后台任务**的标准方式。它由 IServiceCollection 托管,随应用启动/停止自动生命周期管理,比裸写线程或 Task.Run 更安全、更可控。

1. 继承 BackgroundService 并重写 ExecuteAsync

核心是继承 BackgroundService,并重写 ExecuteAsync(CancellationToken stoppingToken) 方法。该方法会被框架调用一次,你需在此内部实现持续运行的逻辑(通常用循环 + 延迟)。

  • 必须使用 stoppingToken 检查取消请求,确保能响应应用关闭
  • 避免直接用 while(true) 死循环,要用 await Task.Delay(..., stoppingToken) 支持中断
  • 异常未捕获会导致后台服务意外终止(不会自动重启)

示例:每 5 秒打印一次时间

public class ClockService : BackgroundService
{
    private readonly ILogger<ClockService> _logger;

    public ClockService(ILogger<ClockService> logger) => _logger = logger;

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("当前时间: {Time}", DateTime.Now);
            await Task.Delay(TimeSpan.FromSeconds(5), stoppingToken);
        }
    }
}

2. 在 Program.cs 中注册为托管服务

.NET 6+ 推荐在 Program.cs 的服务容器中注册,使用 AddHostedService<t>()</t>AddScoped<t>().AddHostedService(x => x.GetRequiredService<t>())</t></t>(推荐前者)。

  • 注册后,框架会在应用启动时调用 StartAsync,关闭时调用 StopAsync
  • 服务默认是单例生命周期,无需手动管理实例

注册代码(Program.cs):

Sylius开源电子商务平台 Sylius开源电子商务平台

Sylius开源电子商务平台是一个开源的 PHP 电子商务网站框架,基于 Symfony 和 Doctrine 构建,为用户量身定制解决方案。可管理任意复杂的产品和分类,每个产品可以设置不同的税率,支持多种配送方法,集成 Omnipay 在线支付。功能特点:前后端分离Sylius 带有一个强大的 REST API,可以自定义并与您选择的前端或您的微服务架构很好地配合使用。如果您是 Symfony

Sylius开源电子商务平台 0 查看详情 Sylius开源电子商务平台
var builder = WebApplication.CreateBuilder(args);

// 注册后台服务(自动托管)
builder.Services.AddHostedService<ClockService>();

// 其他服务...
builder.Services.AddControllers();

var app = builder.Build();
app.MapControllers();
app.Run();

3. 使用依赖注入(DI)获取其他服务

BackgroundService 支持构造函数注入,可安全使用 ILoggerIConfiguration、数据库上下文(注意:若用 EF Core,请用 IServiceScopeFactory 创建作用域,避免跨作用域共享 DbContext)。

  • 不要在后台服务中长期持有 scoped 服务(如 DbContext),应按需创建新 scope
  • 需要访问数据库时,建议通过 IServiceScopeFactory 创建临时 scope

带数据库操作的片段示例:

public class DataSyncService : BackgroundService
{
    private readonly IServiceScopeFactory _scopeFactory;
    private readonly ILogger<DataSyncService> _logger;

    public DataSyncService(IServiceScopeFactory scopeFactory, ILogger<DataSyncService> logger)
    {
        _scopeFactory = scopeFactory;
        _logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            using var scope = _scopeFactory.CreateScope();
            var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();

            // 执行查询或保存...
            var count = await context.Users.CountAsync(stoppingToken);
            _logger.LogInformation("用户总数: {Count}", count);

            await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);
        }
    }
}

4. 启动与停止的注意事项

BackgroundServiceStartAsyncStopAsync 是可重写的,但多数场景无需干预。需注意:

  • StopAsync 有默认 5 秒超时(可通过 IHostOptions.ShutdownTimeout 修改)
  • 若你的清理逻辑耗时较长,应在 stoppingToken 触发后尽快退出循环,并在 StopAsync 中做收尾(如释放资源、提交事务)
  • 不建议在 StopAsync 中执行阻塞 IO 或长时间等待 —— 应配合 stoppingToken 提前退出

基本上就这些。用好 BackgroundService 关键就三点:正确响应取消令牌、合理使用 DI、避免在后台任务里滥用生命周期不匹配的服务。它不是万能定时器(复杂调度建议用 Quartz.NET 或 Hangfire),但对轻量级周期性任务非常够用。

以上就是C#怎么配置后台任务 BackgroundService使用方法的详细内容,更多请关注其它相关文章!


# 谁在  # 浏阳营销推广网官网电话  # 河源seo全网推广  # 平凉关键词排名哪家好  # 迪庆seo优化招商  # 成都如何做网络营销推广  # 年轻人职场关键词排名  # 南京推广网络营销哪个好  # 短视频seo优化多难  # 里水网站推广费用  # 珠宝网站如何推广销售  # 新特性  # 需注意  # app  # 用它  # 发展趋势  # 来做  # 你在  # 重写  # 开源  # red  # .net  # 自动重启  # 作用域  # c#  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: 《顺丰同城骑士》查看我的技能方法  店铺如何关联视频号推广?视频号推广有什么用?  苹果手机手电筒无法开启  三星M34录音变声问题_Samsung M34麦克风调整  批改网网页版登录 批改网电脑版学生登录入口  win11如何运行chkdsk命令 Win11检查和修复磁盘逻辑错误教程【修复】  悟空浏览器网页版链接 悟空浏览器网页版最新有效地址  C++如何实现矩阵乘法_C++二维数组矩阵运算代码示例  《狐友》联系客服方法  c++类和对象到底是什么_c++面向对象编程基础  macosmonterey系统外接显示器驱动怎么安装_macosmonterey外接显示器驱动与分辨率调整  Win11怎么开启HDR_Windows 11显示器画质增强设置  mysql归档数据怎么导出为csv_mysql归档数据导出为csv文件的方法  淘口令快速解析技巧  J*aScript对象中深度嵌套URL键的查找与更新策略  从J*a应用程序中导出MySQL表数据的技术指南  Go语言反射机制:如何访问被嵌入结构体遮蔽的方法  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  2025SNH48年度青春盛典门票价格及购买方式  Win10如何查看已安装的更新补丁 Win10卸载指定更新教程【教程】  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  无人机考证官网 中国民航无人机考证官网登录入口  Lar*el Dusk 测试中管理浏览器权限:以剪贴板访问为例  CSS布局中意外顶部空白的调试与解决:深入理解padding-top  mysql如何配置从库只读_mysql从库只读设置方法  申通快递查询 申通物流快递单实时查询入口  鸣潮历史学家灯塔位置一览  《崩坏:星穹铁道》3.6版本异相仲裁打法及配队推荐  猫眼电影app如何设置电影上映提醒_猫眼电影上映提醒设置教程  智慧团建活动报名入口 智慧团建活动报名入口手机端官网​  《图怪兽》退出登录方法  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  抖音怎么解除第三方绑定_抖音解除第三方平台绑定方法介绍  高德地图怎么查看未来行程规划_高德地图未来行程规划查看方法  芒果TV官网登录入口 芒果TV官方网站登录入口  漫蛙官网(首页入口)_漫蛙漫画稳定访问教程分享  win11资源管理器标签页怎么用 Win11文件管理器多标签高效操作【新功能】  我的世界游戏平台入口 我的世界官方官网直达链接  Keras中Convolution2D层及其核心辅助层详解  抖音网页版官方链接 抖音网页版官网链接入口  Python测试中模块导入路径解析的最佳实践  快手极速版在线体验区 快手极速版网页体验入口  智学网成绩单查询系统网_智学网学生平台登录  QQ网页版官方账号登录入口 QQ网页版网页版入口快速导航  申通快递物流信息查询 申通快递包裹状态追踪  PHP中实现JSON数据数组分页的教程  如何高效地基于键列值映射DataFrame中的多个列  快递优选如何查优选物流_快递优选专属物流渠道查询与配送时效  Win11怎么设置分辨率 Win11显示设置调整分辨率及刷新率修改  sf漫画官网登录入口直达_sf漫画官方正版网址 

 2025-12-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.