我有一个长期运行的工作,它迭代了超过一百万行来完成一些任务。 如果为作业请求关闭,我希望能够停止在此迭代的中间位置。基本上我有这个
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 of scheduler时,我在IJob或Scheduler上找不到任何连接。
这个长时间运行的作业是我在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();
}
}
答案 0 :(得分:3)
所以我正在读石英。我以前从未使用它,但这个帖子很有趣Async/Await Support
阅读后,我注意到目前的想法是使用继承IInterruptableJob
的{{1}}。
这允许调度程序调用中断方法以允许您“很好地”停止代码。从该界面上的文档:
实际中断工作的方法必须在工作中实施 本身(这个方法 接口只是调度程序通知的一种手段 已经请求中断它)。这个机制 你的工作用来中断自己可能会因实现而异。 但是,任何实现中的原则思想都应该是 工作的主体定期检查一些标志 查看是否已请求中断,以及是否设置了标志,不知何故 中止其余工作的表现。一个例子 可以在Example7的DumbInterruptableJob类的源代码中找到中断作业 使用是合法的 和的一些组合 内部同步 为了让方法块直到 它已注意到设置标志的信号。
我希望这会有所帮助。