【问题标题】:How to stop and delete all processing background jobs in hangfire?如何停止和删除hangfire中的所有处理后台作业?
【发布时间】:2019-06-26 10:53:02
【问题描述】:

我在 AspNet Core 项目中使用 Hangfire 来运行一些后台作业。当我重新启动服务器时,新的后台作业排队并处理,但所有以前的后台作业都在继续处理或重新启动。我已经从数据库中删除了所有旧的处理后台作业,但没有任何改变,这个已删除的作业已从数据库中删除但仍在处理中。如何停止和删除所有未反映在数据库中的处理后台作业?

【问题讨论】:

    标签: c# asp.net-core backgroundworker hangfire


    【解决方案1】:

    首先,您应该使用cancellation tokens。在您的工作中,将 IJobCancellationToken 对象作为参数传递给您的其他参数:

    public void MyJob( <<other args>>, IJobCancellationToken cancellationToken)
    {
        for (var i = 0; i < Int32.MaxValue; i++)
        {
            cancellationToken.ThrowIfCancellationRequested();
    
            Thread.Sleep(TimeSpan.FromSeconds(1));
        }
    }
    

    要将您的作业加入队列,请将 IJobCancellationToken 设为 null:

    string jobID = BackgroundJob.Enqueue(() => MyJob(<<other args>>, JobCancellationToken.Null));
    

    现在要取消和删除作业,请通过代码执行:

    BackgroundJob.Delete(jobID);
    

    【讨论】:

    • 为什么需要取消令牌?这是因为作业在调用 delete 时可能已经触发了它的方法吗?但是对于许多操作,我们必须检查取消标记并在方法的最顶部抛出异常。只有少数操作(例如循环)会有其他关口,通过检查取消令牌和抛出异常来潜在地停止处理是有意义的。所以人们会认为,对于许多用例来说,唯一现实的策略是取消必须阻止作业调用其方法。
    • 你试过这个本地调试会话吗?因为在会话结束之前或在启动时第一次取消所有作业会很好。我不确定在会话关闭期间是否可能。启动需要从数据存储中加载所有作业并在任何作业排队之前删除/取消 - 但这可能吗?
    【解决方案2】:

    您还可以从 Hangfire 控制面板中删除 Hangfire 作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2017-03-09
      • 1970-01-01
      • 2023-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多