一个 Task.Run 悄悄杀死了 BackgroundService——.NET 的冷启动陷阱
来源:dev.to — Jul 25-26
📋 概述
在 .NET 的 BackgroundService 中,ExecuteAsync 方法的返回值决定了服务是否被认为“已启动”。当开发者在 ExecuteAsync 中用 Task.Run 启动异步循环,但忘记 await 时,方法会立即返回——框架认为服务已成功启动,而实际的后台循环要么丢失了异常传播,要么根本没运行。
🔑 核心要点
- BackgroundService 的 ExecuteAsync 必须阻塞直到 CancellationToken 被触发——提前返回会让框架错误地认为服务已完成。
- Task.Run 不 await 是最隐蔽的反模式:无异常、无日志、无警告,后台任务就这样静默消失。
- 正确做法:在 ExecuteAsync 中直接 await 实际工作循环,将 Task.Run 的职责限制在 CPU 密集型操作的并行化上。
💡 金句
BackgroundService 启动成功,后台任务从未运行——.NET 框架就这样平静地说了一个谎。
👍 0
👎 0
← 返回 Dev.to 首页