SuperAPI AI 工具集

worker-services

编程与开发

查看项目

更新于 10-16 04:01

技能介绍

用途

worker-services 是一份关于 .NET 后台任务与工作服务的技能资料,介绍如何使用 IHostedService、BackgroundService 及 .NET 托管服务模式来构建后台处理逻辑。

主要能力

资料提供了多个可参考的模式示例:

1. BackgroundService(首选)

展示了一个 OrderProcessingWorker,继承 BackgroundService,通过 IServiceScopeFactory 创建工作域并解析 IOrderService,循环获取待处理订单并逐一处理,使用 Task.Delay 间隔 30 秒,注册方式为 builder.Services.AddHostedService<OrderProcessingWorker>()。

2. 基于队列的工作器(Channel)

包含一个共享的 BackgroundTaskQueue,内部使用 Channel.CreateBounded<Func<IServiceScopeFactory, CancellationToken, ValueTask>> 创建有界队列,容量默认 100,FullMode 设为 BoundedChannelFullMode.Wait,提供 QueueAsync 与 DequeueAsync 方法。配套的 QueuedBackgroundWorker 从队列取出工作项并执行。示例还展示了如何在 API 端点中通过 QueueAsync 入队一个报告生成任务,并返回 TypedResults.Accepted()。

3. 定时后台服务

展示了一个 CleanupWorker,使用 PeriodicTimer 每隔 1 小时触发一次,在作用域内解析 AppDbContext,删除创建时间早于 30 天前的临时文件,并记录清理数量。重写 Dispose 释放计时器。

4. 独立工作服务

提供了独立 worker(非 Web 应用)的 Program.cs 示例:使用 Host.CreateApplicationBuilder(args),调用 AddServiceDefaults()(Aspire 集成),注册 EventConsumerWorker 和 AppDbContext(配置 Npgsql),最后 host.Run()。

关键模式

资料总结了以下实践要点:

  • 在 worker 中始终使用 IServiceScopeFactory 创建作用域(托管服务是单例,DbContext 等作用域服务需要自己的作用域)。
  • 定时工作使用 PeriodicTimer 而非 Task.Delay(更准确,且尊重取消)。
  • 生产者/消费者队列使用 Channel<T>(线程安全,支持背压)。
  • 在循环体内处理异常,而不是在循环外(防止 worker 因错误停止)。
  • 在所有循环中检查 stoppingToken 并传递给异步操作。
  • 记录生命周期事件(启动、停止、错误)以便可观测。

使用方式

资料以 C# 代码示例形式呈现,可直接参考示例中的类定义、注册方式和调用模式。注册托管服务使用 AddHostedService,独立 worker 使用 Host.CreateApplicationBuilder 构建并运行宿主。

适用场景

适合在 .NET 项目中实现后台处理、订单处理、定时清理、队列消费等场景的开发者参考。

限制

资料未提供具体的 NuGet 包依赖版本、性能基准、部署要求或收费信息。参考资料链接指向微软官方文档的 worker services 与 background tasks 页面。