2010-06-17 50 views

回答

9

您可以使用BackgroundWorker來響應Service.Start事件執行冗長的操作。

ServiceBase衍生課程的OnStart()方法中很容易做到這一點。還有一個合理的good example on MSDN

protected override void OnStart(string[] args) 
{ 
    var worker = new BackgroundWorker(); 
    worker.DoWork += DoSomeLongOperation; 

    worker.RunWorkerAsync(); 
} 

private void DoSomeLongOperation(object sender, DoWorkEventArgs e) 
{ 
    // do your long operation... 
} 

請注意,您也可以訂閱ProgressChangedRunWorkerCompleted事件,這樣就可以通知你的進步服務控制管理器和啓動成功(或失敗)。

1

我必須這樣做:我在啓動時產生了一個線程,它完成所有初始化,並在完成時將私有'isInitialized'設置爲true。該服務定期執行動作(即,在計時器上),並且如果isInitialized未設置爲true,則不會開始這些動作。

1

我們通常使用一個簡單的計時器來實現此功能。我們將在服務OnStartup中設置計時器,讓服務響應服務控制管理器,然後讓計時器在幾秒鐘後啓動進程。這個過程可以在一個單獨的線程中進行,也可以不依賴於需要完成的工作。定時器可以重複使用,如果這個過程需要定期發生。

0

最好的實用方法是創建一個工作線程。

通常存在另一種記錄方式,我可以在非託管代碼的例子中解釋。在初始化過程中,Windows服務需要很短的時間來執行此操作。這一次可以在註冊表中的某處進行更改。如果服務需要更多,如果可以撥打

SetServiceStatusdwCurrentState=SERVICE_START_PENDING一些dwCheckPointdwWaitHintSERVICE_STATUS結構的填充,使dwWaitHint是在毫秒掛起啓動操作所需的估計時間。在指定的時間量過去之前,該服務應使用dwCheckPoint值遞增或dwCurrentState中的一個變化對SetServiceStatus函數進行下一次調用。請參閱http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx上的dwWaitHint說明。

1

我也有這個問題與Windows服務。我認爲你必須保持初始化邏輯低於30秒,否則Windows服務管理器將停止服務。

我做的很簡單。我創建了一個方法,將所有需要執行的重邏輯放在一起,然後創建一個計時器,該計時器在20秒後打勾並執行該方法。因此服務將啓動,然後創建計時器,並以20秒爲間隔對其進行初始化,然後完成初始化。 20秒後,計時器將打勾並啓動應用程序的業務邏輯。當然,你可以指定任何你想要的時間間隔。

你應該申報計時器作爲類的參數:

public partial class YourService: ServiceBase 
{ 
    System.Timers.Timer tmrOnStart; 

然後在OnStart方法

protected override void OnStart(string[] args) 
{ 
    //set the interval to 20 seconds 
    tmrOnStart = new Timer(); 
    tmrOnStart.Interval = 20000; 
    tmrOnStart.Enabled = true; 
    tmrOnStart.AutoReset = false; 
    tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed); 
    tmrOnStart.Start(); 
} 

初始化定時器當定時器會觸發Elapsed事件,它將執行這種方法:

void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    heavyBusinessLogicMethod(); 
} 

而你必須把你的邏輯放在heavyBusine ssLogicMethod方法。