c# – 如何在没有Hangfire Pro的情况下处理批处理作业

我已将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);

我唯一能想到的是为批处理中的每个作业设置一个标记’完成’,并在批处理中检查每个作业的结尾是否通过检查表中所有批处理相关行的标志来完成所有作业,然后如果所以将createReportForBatch排队.虽然这样做似乎有点hackish然后我必须提出问题,我可以在另一个BackgroundJob(基本上嵌套)中排队后台工作.感谢您的任何意见或建议.

最佳答案 1.实施过滤器

批处理使用可用于任何人的可扩展性API.您可以创建一个过滤器,在创建阶段将后台作业ID添加到某个持久集,在状态更改过程中为集中的项设置“已处理”状态,在处理作业时检查其他待处理作业,并启动一个新的后台作业,如果它是批处理中的最后一个.

这是批次的高级概述.为了避免不同的竞争条件和不同的场景(作业重新排队,删除等),需要考虑很多事情.

2.使用Hangfire TPL

或者,如果批处理中的后台作业数量相对较少,则可以使用Hangfire TPL来并行执行计算.因此批处理A是一个简单的后台作业,批处理B是它的延续.批处理A和批处理B的方法使用TPL进行方法jobAN,Task.WaitAll等待它们的完成.

点赞