2015-02-10 66 views
5

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

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

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

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

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

+1

嗨你有没有找到如何取消删除作业时,该工作/删除排队或正在运行的任务>? – 2015-04-22 10:11:42

+1

要以编程方式取消作业,请调用'BackgroundJob.Delete'。请参阅:http://discuss.hangfire.io/t/cancel-a-running-job/603 – Dejan 2015-05-13 14:40:47

+0

@Dejan - 谢谢 – 2015-05-18 21:28:00

回答

3

文档不完整。 IJobCancellationToken.ThrowIfCancellationRequested方法抛出一个异常后的下列条件满足:

  1. 引发迟发型服务器关机。当有人呼叫StopDispose方法BackgroundJobServer时,会触发此事件。
  2. 后台作业未处于Processed状态。
  3. 后台作业正由另一名工作人员执行。

后两种情况是通过查询当前后台作业状态的作业存储执行的。所以,如果您从仪表板中删除或重新排列它,取消标记也会丢失。

+1

好的,谢谢。我正在'ShutdownToken'上检查标志,而不是使用内部拉取数据库的ThrowIfCancellationRequested。 – llapinski 2015-02-11 12:31:52

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."); 
}