取消为 Hangfire.io 安排的 运行 作业

Cancel running job scheduled with Hangfire.io

我使用 hangfire.io 库安排作业,我可以观察到它正在内置仪表板中处理。但是,我的系统要求可以从仪表板取消作业。

有一个选项可以删除 运行 作业,但这只会更改数据库中作业的状态,不会停止 运行 作业。

我在文档中看到有传递 IJobCancellationToken 的选项,但据我了解,它用于在整个服务器关闭时正确停止作业。

有没有办法以编程方式取消已经 运行 的任务?

我是否应该编写自己的组件来定期拉取数据库并检查当前服务器实例是否是已取消的 运行 作业?例如维护字典 jobId -> CancellationTokenSource 然后使用适当的 tokensource 发出取消信号。

文档有点不完整。 IJobCancellationToken.ThrowIfCancellationRequested 方法在 任何 满足以下条件后抛出异常:

  1. 已启动 Hangfire 服务器关闭。当有人调用 BackgroundJobServer.
  2. StopDispose 方法时触发此事件
  3. 后台作业未处于 Processed 状态。
  4. 另一个工作人员正在执行后台作业。

后两种情况是通过查询当前后台作业状态的作业存储来执行的。因此,如果您也从仪表板中删除或重新排队,取消令牌将抛出。

如果您从仪表板中删除作业,这将起作用

static public void DoWork(IJobCancellationToken cancellationToken)
{
    Debug.WriteLine("Starting Work...");
    for (int i = 0; i < 10; i++)
    {
        Debug.WriteLine("Ping");

        try
        {
            cancellationToken.ThrowIfCancellationRequested();

        }
        catch (Exception ex)
        {
            Debug.WriteLine("ThrowIfCancellationRequested");
            break;
        }
        //Debug.WriteProgressBar(i);
        Thread.Sleep(5000);
    }

    Debug.WriteLine("Finished.");
}