2016-08-15 12 views
0

私は何百万もの行を繰り返し実行して、いくつかのタスクを実行する長い実行ジョブを持っています。 ジョブのシャットダウンが要求された場合、この繰り返しの途中で停止したいと考えています。基本的に私はこの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(); 
    } 
} 
+0

キャンセルトークンを使用することもできますし、自動採点 –

+0

は提案に@CallumLiningtonに感謝します。私はクラス内のいずれかをラップすることができます。また、autofacを使ったシングルインスタンスも良いアイデアです。他の解決策がない場合、あなたの考えを試してみます。 – dariogriffo

+0

あなたはこれを見ましたか?https://github.com/quartznet/quartznet/blob/master/src/Quartz/IInterruptableJob.cs –

答えて

3

のように見えます。私は前にそれを使ったことがないが、このスレッドがダウンして読んだ後Async/Await Support

面白かった、私は現在のアイデアがIJobを継承IInterruptableJobを使用することです気づきました。

これにより、schedularが割り込みメソッドを呼び出して、コードを「きれいに」止めることができます。そのインターフェイス上のドキュメントから:

、実際に仕事を中断する手段は 自体内に実装する必要があります(この インタフェースのメソッドは、要求があったこと を知らせるために、単にスケジューラのための手段であり、中断するために作られた)。 ジョブが自分自身を中断するために使用するメカニズムは、実装によって異なる場合があります。 しかし、実装の原則的な考え方は、ジョブの本体が のフラグを定期的にチェックして割り込みが要求されているかどうかを確認し、フラグが設定されていれば、何らかの理由で が残りのジョブのパフォーマンスを中止します作業。仕事を中断 の例は、それは気づいてい 信号までのメソッドブロックを持っているために、 のいくつかの組み合わせと内 同期と を使用することが合法であるクラスExample7のDumbInterruptableJob のソースで見つけることができますセットフラグ。

これが役立ちます。