2008-10-19 214 views

回答

35

这是很好的做法,完成尽可能快地开始为您服务。所以,在开始状态时,只做你绝对需要承认它启动成功;稍后再做。如果开始仍是一个漫长的过程,用SetServiceStatus定期通知服务控制管理器你还没有完成,所以也没有时间,你的服务。

+10

熊请记住,如果有另一项服务依赖于您自己的服务,那么一旦您的服务发布了SERVICE_RUNNING,它可能会期望您的服务功能完整。这是在发布SERVICE_RUNNING之前完成初始化的一个很好的理由,并且如果需要,可以在SetServiceStatus中请求更多时间。 – 2011-02-04 10:38:41

78

我罗慕洛同意整理为尽快开始为您服务。但是,如果您需要时间并且您正在使用.NET Framework 2.0或更高版本,则可以考虑ServiceBase.RequestAdditionalTime()方法。

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.requestadditionaltime.aspx

protected override void OnStart() 
{ 
    this.RequestAdditionalTime(10000); 
    // do your stuff 
} 
+1

谢谢,这帮了我很多!我有一些旧代码,需要让它运行... – Turrau 2010-07-22 17:40:09

+0

警告,可能的警告:“HostControl的文档。RequestAdditionalTime无法表示您只能要求60或120秒的最大值。 “(从这里:https://stackoverflow.com/questions/19589686/topshelf-timeout-issue,还没有验证它,但值得考虑) – 2018-01-03 12:30:29

1

我也不得不处理可能需要几秒钟/分钟,有一个良好的开端的服务。当服务启动时,它会尝试连接到SQL Server。但是,当整个服务器重新启动时,我的服务正在启动SQL Server之前。 (我知道服务依赖关系,但由于某种原因它不适用于我的情况......)。我试图做一个循环尝试10次连接到SQL Server,但由于Timeout的原因,Windows在第二次尝试之前正在终止我的服务。

我的解决方案:我在我的服务的“onStart()”中添加了一个Timer。然后,服务的“onTick()”方法尝试连接到SQL Server 10次(等待30秒)。在启动时不再有超时。

所以基本上,

  • 我的服务在5秒内启动。
  • 将定时器服务10秒后推出的是 开始。
  • 定时器尝试10倍[等待每次30秒]到 连接到SQL Server。
  • 如果成功,定时器将自行关闭,如果不成功(10次尝试后),我停止服务。

注意的更优雅的方式来解决问题,但也许我的解决方案可以帮助任何人比我相同的情况下的某些部分,

2

根本就timeintensive东西在另一个线程

protected override void OnStart(string[] args) 
    { 
     var task = new Task(() => 
     { 
      // Do stuff 
     }); 
     base.OnStart(args); 
     task.Start(); 
    }