私は何百万もの行を繰り返し実行して、いくつかのタスクを実行する長い実行ジョブを持っています。 ジョブのシャットダウンが要求された場合、この繰り返しの途中で停止したいと考えています。基本的に私はこのQuartz.netのシャットダウンメソッドへのフック
public class MyLongRunningJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var rows = GetAllRows();
foreach(var row in rows)
{
DoSomething(row);
}
}
}
を持っていると私は、Executeメソッドは、私がsomepointでtrueに_stopを設定したい1時間以上かかることがありますので、私は何かを見つけることができません。この
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);
}
}
}
ような何かをしたいですスケジューラのシャットダウンを呼び出すと、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を使ったシングルインスタンスも良いアイデアです。他の解決策がない場合、あなたの考えを試してみます。 – dariogriffo
あなたはこれを見ましたか?https://github.com/quartznet/quartznet/blob/master/src/Quartz/IInterruptableJob.cs –