7

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

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

我在文档中看到有一个选项可以通过,IJobCancellationToken但是据我了解,它用于在整个服务器关闭时正确停止作业。

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

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

4

2 回答 2

5

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

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

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

于 2015-02-11T10:47:48.337 回答
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.");
}
于 2017-03-30T21:32:33.600 回答