使用批量任务¶

仅支持Pro

此功能是 Hangfire Pro 软件包的一部分。

批量任务允许您创建了一堆 原子性 的后台任务。这意味着如果在创建后台任务时出现异常,不会处理这些异常。假设你想要发送1000封电子邮件给你的客户,旧的方法是:

  1. for (var i = 0; i < 1000; i++)
  2. {
  3. BackgroundJob.Enqueue(() => SendEmail(i));
  4. // What to do on exception?
  5. }

但是如果任务存储在 中途 不可用呢?可能已经发送了500封电子邮件,因为工作线程创建后将会接收和处理任务。如果您重新执行此代码,您的某些客户可能会收到烦人的重复邮件。所以如果你想正确处理这个问题,你应该编写更多的代码来跟踪电子邮件的发送情况。

但这里有一个简单的方法:

  1. BatchJob.StartNew(x =>
  2. {
  3. for (var i = 0; i < 1000; i++)
  4. {
  5. x.Enqueue(() => SendEmail(i));
  6. }
  7. });

万一有异常,您可能会向用户显示错误,几分钟后重试。不需要其他代码!

安装¶

批量任务来自 Hangfire.Pro 的软件包,您可以使用NuGet软件包管理器控制台窗口进行安装:

  1. PM> Install-Package Hangfire.Pro

执行批量任务需要添加一些过滤器,一些新页面到仪表板,以及一些新的导航菜单项。幸亏在 GlobalConfiguration 类中只需简单地调用方法:

  1. GlobalConfiguration.Configuration.UseBatches();

有限的存储支持

目前仅支持 Hangfire.SqlServerHangfire.Pro.Redis 任务存储。批量任务没有什么特别之处,但需要实现一些新的存储方法。

链式批量任务¶

允许您将多个批量任务连在一起执行。一旦 所有父任务 完成,将执行子任务。回到之前的示例,您有1000个电子邮件发送。如果发送邮件后执行别的操作,只需继续添加任务:

  1. var id1 = BatchJob.StartNew(/* for (var i = 0; i < 1000... */);
  2. var id2 = BatchJob.ContinueWith(id, x =>
  3. {
  4. x.Enqueue(() => MarkCampaignFinished());
  5. x.Enqueue(() => NotifyAdministrator());
  6. });

因此,批量任务和链式批量任务允许您定义工作流和并行操作。这对于密集型计算非常有用,因为它们可以分配到不同的机器。

复杂的工作流程¶

不限制您仅在入队状态下创建任务。您可以在延迟任务中继续添加后续的操作。

  1. var batchId = BatchJob.StartNew(x =>
  2. {
  3. x.Enqueue(() => Console.Write("1a... "));
  4. var id1 = x.Schedule(() => Console.Write("1b... "), TimeSpan.FromSeconds(1));
  5. var id2 = x.ContinueWith(id1, () => Console.Write("2... "));
  6. x.ContinueWith(id2, () => Console.Write("3... "));
  7. });
  8.  
  9. BatchJob.ContinueWith(batchId, x =>
  10. {
  11. x.Enqueue(() => Console.WriteLine("4..."));
  12. });

原文:

http://hangfirezh.zhs.press/background-methods/using-batches.html