在C#后端开发中,长时间运行的后台工作流通常指那些需要执行几分钟、几小时甚至数天的任务,例如订单履约、数据批处理或跨系统同步。这类任务不能放在Web请求里同步完成,必须放到后台调度。Temporal和Hangfire是两种常见方案,但设计理念差别很大。

Hangfire的工作方式
Hangfire是一个基于队列的调度库,任务以委托或静态方法的形式存入数据库,由后台进程拉取执行。它使用简单,在ASP.NET Core里几行代码就能跑起来。
// 安装 Hangfire.AspNetCore 后配置
public void ConfigureServices(IServiceCollection services)
{
services.AddHangfire(x => x.UseSqlServerStorage("Server=.;Database=hf;Trusted_Connection=true"));
services.AddHangfireServer();
}
// 发起一个延时后台任务
BackgroundJob.Schedule(() => Console.WriteLine("超时未支付取消订单"), TimeSpan.FromMinutes(30));
如果任务在执行中进程重启,Hangfire会根据数据库里的状态自动重试,但它不擅长表达复杂分支和长周期状态机。
Temporal的工作方式
Temporal将业务逻辑写成工作流和活动的代码。工作流负责流程编排,活动负责具体执行。即便工作流跑了三天,中间服务重启也不会丢失进度。
// 定义工作流接口
public interface IOrderWorkflow : IWorkflow
{
Task RunAsync(string orderId);
}
// 工作流实现,可写循环、等待、分支
public class OrderWorkflow : IOrderWorkflow
{
public async Task RunAsync(string orderId)
{
await Workflow.ExecuteActivityAsync<ICheckPayment>(orderId);
await Workflow.SleepAsync(TimeSpan.FromHours(24));
await Workflow.ExecuteActivityAsync<ICloseOrder>(orderId);
}
}
核心差异对比
| 维度 | Hangfire | Temporal |
|---|---|---|
| 编程模型 | 任务方法+队列 | 工作流+活动代码 |
| 长流程状态 | 弱,靠重试 | 强,事件溯源持久化 |
| 上手成本 | 低 | 较高,需跑Worker和Server |
| 适用场景 | 定时、简单后台作业 | 跨天业务流、合规审计流 |
怎么选
如果你的后台工作只是发邮件、清理数据、定时同步,用Hangfire就够了。当业务本身就是一个不能中断的长流程,并且要可查询、可恢复、可补偿,Temporal更合适。C#通过 Temporal SDK 能自然地把工作流写成普通异步方法,降低分布式复杂度。
经验法则:看任务是否能用一张表记录状态机,如果不能,就考虑 Temporal。
小结
两者并非互斥。小型服务用Hangfire快速交付,核心链路用Temporal保命,是很多团队的实际做法。