在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. 可执行初始化
- 4. tensorflow服务未初始化
- 5. 如何在不是自托管的WCF服务库中执行初始化?
- 6. JSON初始化服务中的数据
- 7. CKEDITOR的初始化功能未执行
- 8. 在Windows phone7中创建冗长的webLink
- 9. Angular 2服务的异步初始化
- 10. Windows初始执行上下文
- 11. 在Windows Phone 8.1中初始化XLabs
- 12. 哈德森 - 安装为Windows服务初始化失败
- 13. 配置系统初始化失败 - Windows服务.NET
- 14. 在初始化/代理服务器/代理服务器/
- 15. 使用ES6模块执行初始化
- 16. jQuery Plugin初始化函数不执行
- 17. Django初始化后执行代码
- 18. 何处为System.loadLibrary执行库初始化?
- 19. Grails在事务服务中获取lazzy初始化异常
- 20. Windows服务计划执行
- 21. 初始化时挂起弹簧服务
- 22. 无法从Web服务初始化SpringHibernateFactory
- 23. 解析服务器Twilio未初始化
- 24. RIA服务初始化问题
- 25. Azure服务结构演员初始化
- 26. Silverlight - 服务器端初始化
- 27. Delphi COM服务器初始化
- 28. Angular 2服务初始化逻辑
- 29. Rails服务器减少冗长?
- 30. java中的初始化初始化