TMa*_*Man 5 c# batch-processing hangfire
我已经在项目中实施了Hangfire。现在,我需要排队多个工作,这些工作从技术上讲是批处理的一部分。公司不会购买可提供批处理功能的专业版Hangfire。我有什么变通办法可以告诉我所有相关作业何时完成,以便我可以在每个批处理的最后调用另一个函数吗?
例:
Batch A:
{
BackgroundJob.Enqueue(jobA1);
BackgroundJob.Enqueue(jobA2);
BackgroundJob.Enqueue(jobA3);
}
When Batch A is all done:
BackgroundJob.Enqueue(createReportForBatchA);
Batch B:
{
BackgroundJob.Enqueue(jobB1);
BackgroundJob.Enqueue(jobB2);
BackgroundJob.Enqueue(jobB3);
}
When Batch B is all done:
BackgroundJob.Enqueue(createReportForBatchB);
Run Code Online (Sandbox Code Playgroud)
我唯一能想到的是为批处理中的每个作业设置一个标记“完成”,并在批处理中的每个作业结束时通过检查表中所有与批处理相关的行的标记来检查所有作业是否都已完成。因此将createReportForBatch排队。这样做似乎有点骇人听闻,然后我不得不提出一个问题,我可以将一个后台作业放入另一个BackgroundJob(基本上嵌套)中吗?感谢您的任何意见或建议。
1. 实现过滤器
批量使用任何人都可以使用的可扩展性 API。您可以创建一个过滤器,在创建阶段将后台作业 ID 添加到某个持久集,在状态更改过程中设置集中项目的“已处理”状态,在处理作业时检查其他挂起的作业,并启动一个新的后台作业(如果它是批次中的最后一个作业)。
这是批次的高级概述。有很多事情需要考虑,以避免不同的竞争条件和不同的场景(作业重新排队、删除等)。
2. 使用 Hangfire + TPL
或者,如果批处理中的后台作业数量相对较少,则可以使用 Hangfire + TPL 来并行执行计算。因此,Batch A是一个简单的后台作业,Batch B是其延续。批次 A和批次 B的方法使用 TPLjobAN来Task.WaitAll等待其完成。