2011-12-21 106 views
6

通常對於服務,您要完成的任務重複進行,可能是循環或可能是觸發器或其他。Topshelf - 處理循環

我使用Topshelf完成重複任務對我來說,特別是我使用的Shelf'ing功能。

我遇到的問題是如何處理任務的循環。

當引導捆紮在Topshelf服務,你傳遞一個類(在這種情況下ScheduleQueueService),並表示這是其Start方法,它的Stop方法:

例子:

public class QueueBootstrapper : Bootstrapper<ScheduledQueueService> 
{ 
    public void InitializeHostedService(IServiceConfigurator<ScheduledQueueService> cfg) 
    { 
     cfg.HowToBuildService(n => new ScheduledQueueService()); 
     cfg.SetServiceName("ScheduledQueueHandler"); 
     cfg.WhenStarted(s => s.StartService()); 
     cfg.WhenStopped(s => s.StopService()); 
    } 
} 

但在我的StartService()方法我正在使用while循環來重複我正在運行的任務,但是當我嘗試通過Windows服務停止服務時,它無法停止並且我懷疑它是因爲StartService()方法在最初調用時從未結束。

例子:

public class ScheduledQueueService 
{ 
    bool QueueRunning; 

    public ScheduledQueueService() 
    { 
     QueueRunning = false; 
    } 


    public void StartService() 
    { 
     QueueRunning = true; 

     while(QueueRunning){ 
        //do some work 
     } 
    } 

    public void StopService()  
    { 
     QueueRunning = false; 
    } 
} 

什麼是這樣做的更好的辦法?

  1. 我使用.NET System.Threading.Tasks運行在工作中考慮到,然後

  2. 也許使用Quartz重複任務,然後將其刪除,也許收盤StopService()線程。

想法?

回答

0

我不知道Topshelf專門但是寫一個標準的Windows服務時所需的啓動和停止事件儘快完成。例如,如果啓動線程需要太長的時間,則認爲啓動線程無法啓動。

爲了解決這個問題,我通常使用System.Timers.Timer。這被設置爲以非常短的時間間隔調用啓動方法一次(因此它幾乎立即運行)。這接下來完成了大部分工作。

在你的情況下,這可能是你的循環方法。然後在每個循環的開始處檢查一個全局關閉變量 - 如果它是真的,則退出循環,然後程序可以停止。

您可能需要多一點(或者更少)的複雜性比這取決於究竟哪裏出錯,但總的原則應該是罰款,我希望。

雖然我會再次否認這一知識不是基於頂蓋,而是總體服務的發展。

+0

經過這麼多年,任何人都知道Topshelf的確是這樣嗎?在Topshelf文檔中沒有提示,我正在努力決定是否應該在我的服務中系統地產生一個新線程或類似的WhenStarted()。 – guillaume31 2016-09-12 14:22:07

3

一般情況下,我將如何處理,這是有一個Timer事件,將觸發過了幾分鐘StartService()被調用後。在活動結束後,我會檢查一個stop標誌(在​​設置),如果標誌(例如,您的QueueRunning)不存在,那麼我會註冊計時器單一事件在幾分鐘再次發生。

我們做Topshelf本身,當輪詢文件系統非常類似:https://github.com/Topshelf/Topshelf/blob/v2_master/src/Topshelf/FileSystem/PollingFileSystemEventProducer.cs#L80

現在使用內部調度類型,而不是一個Timer對象,但通常這是同樣的事情。 fiber基本上是哪個線程來處理事件。

如果您有將來的問題,歡迎您加入Topshelf郵件列表。我們試着在那裏做出相應的迴應。 http://groups.google.com/group/topshelf-discuss

+0

第一個鏈接中斷 – SteveC 2015-07-15 10:36:48

+2

你是對的SteveC。固定! – Travis 2015-07-16 12:02:47