我使用hangfire.io库计划作业,我可以观察它在内置仪表板中处理。但是,我的系统要求可以从仪表板中取消作业。
可以选择删除正在运行的作业,但这只会更改数据库中作业的状态,并且不会停止运行作业。
我在文档中看到有传递IJobCancellationToken
的选项,但据我所知,它用于在整个服务器关闭时正确停止作业。
有没有办法实现已经运行的任务的编程取消?
我应该编写自己的组件来定期提取数据库并检查当前服务器实例是否正在运行已取消的作业?例如,维护字典jobId - > CancellationTokenSource然后使用适当的tokensource信号取消。
答案 0 :(得分:3)
文档不完整。在满足以下条件的任何之后,IJobCancellationToken.ThrowIfCancellationRequested
方法抛出异常:
Stop
的{{1}}或Dispose
方法,则会触发此事件。BackgroundJobServer
状态。后两种情况是通过查询当前后台作业状态的作业存储来执行的。因此,如果您也从仪表板中删除或重新排队,则会抛出取消令牌。
答案 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.");
}