我有一個長時間運行的作業,它遍歷數百萬行來完成一些任務。 如果要求關閉作業,我希望能夠在此迭代的midle中停止。基本上我有這個掛鉤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在somepoint設置爲true,我無法找到任何東西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();
}
}
您可以使用取消令牌或autoresetevent –
感謝@CallumLinington的建議,我可以將其中的任何一個封裝在類中,使用autofac封裝單個實例,這是一個好主意,但我希望Quartz更直接。如果沒有其他解決方案,我會試一試。 – dariogriffo
你見過這個https://github.com/quartznet/quartznet/blob/master/src/Quartz/IInterruptableJob.cs –