C# Quartz.net中的Hook-to-shutdown方法
我有一个长时间运行的作业,它迭代数百万行来完成一些任务。 如果请求关闭作业,我希望能够在迭代的中期停止。基本上我有这个C# Quartz.net中的Hook-to-shutdown方法,c#,quartz.net,C#,Quartz.net,我有一个长时间运行的作业,它迭代数百万行来完成一些任务。 如果请求关闭作业,我希望能够在迭代的中期停止。基本上我有这个 public class MyLongRunningJob : IJob { public void Execute(IJobExecutionContext context) { var rows = GetAllRows(); foreach(var row in rows) {
public class MyLongRunningJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var rows = GetAllRows();
foreach(var row in rows)
{
DoSomething(row);
}
}
}
我想要这样的东西
public class MyLongRunningJob : IJob
{
bool _stop = false;
public void Execute(IJobExecutionContext context)
{
var rows = GetAllRows();
foreach(var row in rows)
{
if(_stop) break;
DoSomething(row);
}
}
}
由于Execute方法可能需要1个多小时,我想在某个时候将_stop设置为true,因此在调用我的调度程序的Shutdown时,我在IJob或调度程序上找不到任何要连接的内容
这个长时间运行的作业是在我的windows服务上执行的唯一任务,我希望尽快退出Execute方法
windows服务是带有Autofac的TopShelf服务,看起来像
public class Service : IService
{
private readonly IScheduler _scheduler;
public Service(IScheduler scheduler)
{
_scheduler = scheduler;
}
public void Start()
{
_scheduler.Start();
}
public void Stop()
{
_scheduler.Shutdown();
}
}
所以我在读石英。我以前从未用过,但这条线很有趣 在阅读之后,我注意到当前的想法是使用
IInterruptableJob
,它继承IJob
这允许调度程序调用中断方法,以便“很好地”停止代码。从该界面上的文档:
实际中断作业的方法必须在
本身(此方法)
接口只是调度器通知用户的一种方式
已提出中断请求)。机制
在不同的实现中,用于中断自身的作业可能会有所不同。
然而,任何实施中的原则思想都应该是
作业主体的定期检查某些标记以
查看是否已请求中断,以及是否以某种方式设置了标志
中止作业其余工作的执行。一个例子
可以在类Example7的DumbInterruptableJob的源代码中找到中断作业
使用是合法的
和的一些组合
和内的同步
为了使方法块在
表示它已注意到set标志
我希望这能有所帮助。所以我在读《石英》。我以前从未用过,但这条线很有趣 在阅读之后,我注意到当前的想法是使用
IInterruptableJob
,它继承IJob
这允许调度程序调用中断方法,以便“很好地”停止代码。从该界面上的文档:
实际中断作业的方法必须在
本身(此方法)
接口只是调度器通知用户的一种方式
已提出中断请求)。机制
在不同的实现中,用于中断自身的作业可能会有所不同。
然而,任何实施中的原则思想都应该是
作业主体的定期检查某些标记以
查看是否已请求中断,以及是否以某种方式设置了标志
中止作业其余工作的执行。一个例子
可以在类Example7的DumbInterruptableJob的源代码中找到中断作业
使用是合法的
和的一些组合
和内的同步
为了使方法块在
表示它已注意到set标志
我希望这能有所帮助。您可以使用取消令牌,或Autoreseteventhanks@Callumlington作为建议,我可以将其中任何一个封装在一个类中,使用autofac的单个实例是一个好主意,但我希望使用Quartz实现更直接的功能。如果没有其他解决方案,我会尝试一下你的想法。你看到了吗?这可能就是我想要的。回答你的意见,我会接受,并投票表决。非常感谢@Callumlingtoni添加了答案您可以使用取消令牌,或Autoreseteventhanks@Callumlington提供建议,我可以用autofac将其中任何一个封装在一个类中,单实例是一个好主意,但我想用Quartz更直接一些。如果没有其他解决方案,我会尝试一下你的想法。你看到了吗?这可能就是我想要的。回答你的意见,我会接受,并投票表决。非常感谢@Callumlingtoni补充了答案