Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Quartz.net中的Hook-to-shutdown方法_C#_Quartz.net - Fatal编程技术网

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补充了答案