2012-04-25 67 views
1

我設計了一個應用程序,開始一個無盡的Thread。此Thread正在通過SOAP-API從特定設備收集事件,並在發生特定事件時執行各種方法。
現在我希望所有這些都作爲服務運行,但我不確定如何設計應用程序。C#服務應用程序啓動無盡線程

我目前的計劃是有服務。該服務創建了一個「poller」類的實例,收集信息。之後,創建一個線程,該線程始終執行「輪詢器」的輪詢功能。是否應在我的服務應用程序的OnStart事件中創建並執行「輪詢器」實例和線程?我是否必須在OnStop事件中停止線程?或者會有更聰明的設計?

我不確定這個,因爲我讀過,OnStart事件不應該永久執行。但是,如果我從這裏撥打Thread,它會永久執行嗎?

感謝您的幫助,因爲這是我的:-)

+2

你需要自己去一個,然後在遇到它們時回到特定的問題。 – Nick 2012-04-25 08:20:58

回答

4

的「輪詢」類將被從您所創建的輪詢線程使用,讓你有一些選擇第一服務應用。我可能會去在poller類ctor中創建輪詢線程 - 似乎沒有理由讓線程有更大的範圍。如果添加了更多設備,您只需創建更多輪詢實例即可。

在OnStart()中,創建一個輪詢實例(它自己創建輪詢線程)並返回,因此滿足'OnStart-Event不應該永久執行'的條件。

在OnStop()中停止線程?首先,嘗試停止線程的首選方法 - 不要嘗試去做。當服務管理器或任務管理器關閉時,您的服務是否正常運行並立即停止?如果是這樣,不要使不必要的,並可能適得其反的工作,試圖明確停止在OnStop()或輪詢類dtor中的輪詢線程。只需將OnStop()留空並查看它是否正常工作。

如果你發現你必須在服務進程被操作系統殺死之前終止一個線程,你可能不得不採取狡猾的手段來說服輪詢線程立即退出,否則你可能會逃脫Thread.Interrupt ()。取決於..

剛看到,我嘗試這樣做:

class poller 
{ 
    public static void ThreadProc() 
    { 
     for (;;) 
     { 

      Thread.Sleep(0); 
     } 
    } 
    Thread myThread; 
    public poller(){ 
     myThread = new Thread(new ThreadStart(ThreadProc)); 
     myThread.Priority = ThreadPriority.BelowNormal; 
     myThread.Start(); 
    } 
}; 

class WindowsService : ServiceBase 
{ 
    poller thisPoller; 
    public WindowsService() 
    { 
     this.ServiceName = "My Windows Service"; 
     this.EventLog.Log = "Application"; 

     this.CanHandlePowerEvent = true; 
     this.CanHandleSessionChangeEvent = true; 
     this.CanPauseAndContinue = true; 
     this.CanShutdown = true; 
     this.CanStop = true; 
    } 
    protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     thisPoller = new poller(); 
    } 
    protected override void OnStop() 
    { 
     base.OnStop(); 
    } 

它內置並與一些項目屬性擺弄和運行installUtil的正確版本後安裝成功。它開始OK,睡眠(0)循環顯然是工作的,因爲服務出現在'進程'選項卡上,在我的i7上CPU使用約17%。當我在任務管理器服務中選擇「停止服務」時,服務狀態直接進入「停止」狀態,但進程消失約20秒(?)。

爲了更好玩,我真的裝上了箱子。我停止了服務,卸載與重建:

protected override void OnStart(string[] args) 
{ 
    base.OnStart(args); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
    thisPoller = new poller(); 
} 

當我重新安裝和重新啓動,我知道這是工作,因爲我能聽到CPU風扇加快轉速之前,我可以得到任務管理器。果然,所有8個核心都100%。

即使使用8個CPU循環線程,停止也沒有問題。再次,狀態立即進入「停止」狀態,過程在20秒後消失。

將睡眠時間間隔設置爲'1000000',以便線程不運行也沒有任何問題 - 開始確定,停止確定。

+0

非常感謝你!這對我有很大幫助!我只有一個問題:在創建輪詢實例時如何「返回」,以便OnStart()不會永遠執行? – MartiniMoe 2012-04-25 10:32:38

+0

只需創建一個輪詢實例並退出onStart()。你可以聲明一個'poller * thisPoller';'變量在Service類的頂部,'thisPoller = new poller(URL)';'在OnStart()中。 – 2012-04-25 12:33:35

+0

非常感謝你爲這個非常詳細的答案!你幫了我很多!對不起,我不能'投票'你的答案,因爲我沒有15聲望:-( – MartiniMoe 2012-04-26 07:41:04

相關問題