用途
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 页面。