在Windows服務啓動時(或從暫停狀態恢復),在不阻止服務控制管理器的情況下,執行一些冗長初始化的最佳方式是什麼?在Windows服務中執行冗長的初始化
回答
您可以使用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...
}
請注意,您也可以訂閱ProgressChanged
和RunWorkerCompleted
事件,這樣就可以通知你的進步服務控制管理器和啓動成功(或失敗)。
我必須這樣做:我在啓動時產生了一個線程,它完成所有初始化,並在完成時將私有'isInitialized'設置爲true。該服務定期執行動作(即,在計時器上),並且如果isInitialized未設置爲true,則不會開始這些動作。
我們通常使用一個簡單的計時器來實現此功能。我們將在服務OnStartup中設置計時器,讓服務響應服務控制管理器,然後讓計時器在幾秒鐘後啓動進程。這個過程可以在一個單獨的線程中進行,也可以不依賴於需要完成的工作。定時器可以重複使用,如果這個過程需要定期發生。
最好的實用方法是創建一個工作線程。
通常存在另一種記錄方式,我可以在非託管代碼的例子中解釋。在初始化過程中,Windows服務需要很短的時間來執行此操作。這一次可以在註冊表中的某處進行更改。如果服務需要更多,如果可以撥打
SetServiceStatus
與dwCurrentState=SERVICE_START_PENDING
一些dwCheckPoint
和dwWaitHint
,SERVICE_STATUS
結構的填充,使dwWaitHint
是在毫秒掛起啓動操作所需的估計時間。在指定的時間量過去之前,該服務應使用dwCheckPoint
值遞增或dwCurrentState
中的一個變化對SetServiceStatus
函數進行下一次調用。請參閱http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx上的dwWaitHint
說明。
我也有這個問題與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方法。
- 1. 如何在spark中執行初始化?
- 2. 在EJB3.1中執行初始化代碼
- 3. 執行-init vs. +初始化
- 4. 可執行初始化
- 5. Angularjs初始化服務
- 6. wcf服務初始化
- 7. tensorflow服務未初始化
- 8. WCF RESTful服務初始化
- 9. Rails 3:僅對服務器啓動執行初始化工具
- 10. 執行服務完全初始化保證
- 11. 如何在不是自託管的WCF服務庫中執行初始化?
- 12. YouTube服務初始化中的java.lang.VerifyError
- 13. AngularJS中的強制服務初始化
- 14. JSON初始化服務中的數據
- 15. 如何初始化Windows服務中的StructureMap
- 16. 在Windows phone7中創建冗長的webLink
- 17. CKEDITOR的初始化功能未執行
- 18. 初始化的DTO使用RIA服務
- 19. Angular 2服務的異步初始化
- 20. 初始化服務器的NodeJS例如
- 21. Rails的服務器:更冗長
- 22. Rails - 在初始化時執行rake任務
- 23. Windows初始執行上下文
- 24. 哈德森 - 安裝爲Windows服務初始化失敗
- 25. 配置系統初始化失敗 - Windows服務.NET
- 26. 在Windows Phone 8.1中初始化XLabs
- 27. 初始化服務器啓動時的同步ThreadPool執行程序
- 28. 在初始化/代理服務器/代理服務器/
- 29. Grails在事務服務中獲取lazzy初始化異常
- 30. 何處爲System.loadLibrary執行庫初始化?