在Quartz.net中挂钩关闭方法

时间:2016-08-15 07:56:16

标签: c# quartz.net

我有一个长期运行的工作,它迭代了超过一百万行来完成一些任务。 如果为作业请求关闭,我希望能够停止在此迭代的中间位置。基本上我有这个

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();
    }
}

1 个答案:

答案 0 :(得分:3)

所以我正在读石英。我以前从未使用它,但这个帖子很有趣Async/Await Support

阅读后,我注意到目前的想法是使用继承IInterruptableJob的{​​{1}}。

这允许调度程序调用中断方法以允许您“很好地”停止代码。从该界面上的文档:

  

实际中断工作的方法必须在工作中实施    本身(这个方法   接口只是调度程序通知的一种手段   已经请求中断它)。这个机制   你的工作用来中断自己可能会因实现而异。   但是,任何实现中的原则思想都应该是   工作的主体定期检查一些标志   查看是否已请求中断,以及是否设置了标志,不知何故   中止其余工作的表现。一个例子   可以在Example7的DumbInterruptableJob类的源代码中找到中断作业   使用是合法的   和的一些组合   内部同步   为了让方法块直到    它已注意到设置标志的信号。

我希望这会有所帮助。

相关问题