取消使用Hangfire.io安排的正在运行的作业

时间:2015-02-10 22:59:55

标签: job-scheduling hangfire

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

可以选择删除正在运行的作业,但这只会更改数据库中作业的状态,并且不会停止运行作业。

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

有没有办法实现已经运行的任务的编程取消?

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

2 个答案:

答案 0 :(得分:3)

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

  1. 启动了Hangfire服务器关闭。如果有人调用Stop的{​​{1}}或Dispose方法,则会触发此事件。
  2. 后台作业不在BackgroundJobServer状态。
  3. 后台工作由另一名工人执行。
  4. 后两种情况是通过查询当前后台作业状态的作业存储来执行的。因此,如果您也从仪表板中删除或重新排队,则会抛出取消令牌。

答案 1 :(得分:0)

如果您从信息中心删除作业

,则此方法有效
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.");
}