【发布时间】:2016-08-16 18:20:26
【问题描述】:
我有一个长期运行的工作,它迭代超过数百万行来完成一些任务。 如果作业请求关闭,我希望能够在此迭代的中间停止。基本上我有这个
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();
}
}
【问题讨论】:
-
您可以使用取消令牌或自动重置事件
-
感谢@CallumLinington 的建议,我可以将其中的任何一个包装在一个类中,使用autofac 的单个实例,这是一个好主意,但我想要使用Quartz 更直接的东西。如果没有其他解决方案,我会尝试您的想法。
-
这可能就是我想要的。让您的评论成为答案,我会接受并投票。非常感谢@CallumLinington
-
我添加了答案
标签: c# quartz.net