2016-08-15 48 views
0

我有一個長時間運行的作業,它遍歷數百萬行來完成一些任務。 如果要求關閉作業,我希望能夠在此迭代的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(); 
    } 
} 
+0

您可以使用取消令牌或autoresetevent –

+0

感謝@CallumLinington的建議,我可以將其中的任何一個封裝在類中,使用autofac封裝單個實例,這是一個好主意,但我希望Quartz更直接。如果沒有其他解決方案,我會試一試。 – dariogriffo

+0

你見過這個https://github.com/quartznet/quartznet/blob/master/src/Quartz/IInterruptableJob.cs –

回答

3

所以我讀入石英。我以前從來沒有使用過它,但這個線程是有趣的Async/Await Support

讀下來後,我發現目前的想法是使用IInterruptableJob其繼承IJob

這可以讓調度函數調用中斷方法來讓你的代碼「很好地」停下來。從該接口上的文檔:

的實際中斷工作必須在 本身(這 接口的方法中實現的手段是簡單的調度通知 一個請求已經有手段使它被打斷)。您的工作用於中斷自己的機制可能因實現而有所不同。 然而,任何實現中的主要思想應該是讓作業的主體週期性地檢查一些標誌到 ,看看是否已經請求了中斷,並且如果標誌被設置,則以某種方式中止其餘作業的性能工作。的 中斷作業的例子可以在源類實施例7的DumbInterruptableJob 發現它是合法使用 的某種組合和內 同步和 纔能有方法塊,直到它已注意到了 信號設置標誌。

我希望這會有所幫助。