2008-10-19 4 views

답변

35

가능한 한 빨리 서비스를 시작하는 것이 좋습니다. 따라서 시작시 상태 일 때 성공적으로 시작되었음을 확인해야하는 사항 만 수행하십시오. 그리고 나중에 나머지를해라. 시작이 인 경우 여전히 SetServiceStatus을 사용하여 서비스 제어 관리자에 아직 완료하지 않았 음을 알리면 서비스가 시간 초과되지 않습니다.

+10

곰 그러나 마음에 그 자체가 다른 서비스가 있다면 SERVICE_RUNNING을 올리면 서비스가 충분히 기능 할 것으로 기대할 것입니다. 이것이 SERVICE_RUNNING을 게시하기 전에 초기화 작업을 완료하고 SetServiceStatus를 사용하여 필요한 경우 더 많은 시간을 요청하는 것이 좋습니다. –

78

가능한 빨리 Romulo에 연락하여 서비스를 시작하는 것에 동의합니다. 그러나 시간이 필요하고 .NET Framework 2.0 이상을 사용하는 경우 ServiceBase.RequestAdditionalTime() 메서드를 고려할 수 있습니다.

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

감사합니다. 덕분에 많은 도움이되었습니다! 나는 오래된 코드를 가지고있어 실행하기 위해 ... – Turrau

+0

Warning, possible caveat : "HostControl의 문서.RequestAdditionalTime은 최대 60 초 또는 120 초까지만 요청할 수 있다는 것을 나타내지 않습니다. 그렇지 않으면 요청을 무시합니다. "(여기에서 : https://stackoverflow.com/questions/19589686/topshelf-timeout-issue, 확인하지는 않았지만 고려해 볼 가치가 있음) –

1

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

은 또한 수도 좋은 시작이 몇 초/분 소요 서비스를 처리했다. 서비스가 시작되면 SQL Server에 연결하려고 시도합니다. 그러나 전체 서버가 다시 시작되면 내 서비스가 SQL Server에서 시작되었습니다. (나는 서비스 의존성에 대해 알고 있지만 특별한 이유없이 내 상황에 적용되지 않는다.). SQL Server에 연결하기 위해 10 번 시도하는 루프를 만들려고했으나 Timeout 때문에 두 번째 시도 전에 Windows에서 서비스가 종료되었습니다.

내 솔루션 : 내 서비스의 "onStart()"에 타이머를 추가했습니다. 그런 다음 서비스의 "onTick()"메서드가 SQL Server에 연결하기 위해 10 번 시도했습니다 (30 명이 대기 중임). 시동시 시간 초과가 없어졌습니다.

그러니까 기본적으로

  • 내 서비스 5 초에 시작됩니다.
  • 서비스가 시작된 후 10 초 후에 타이머가 시작됩니다. 이 시작되었습니다.
  • 타이머는 에 SQL Server에 연결하기 위해 [매 30 초 대기] 10 번 시도합니다.
  • 성공하면 타이머가 자체적으로 사용 중지됩니다. 사용하지 않으면 (10 회 시도한 후) 서비스를 중지합니다.

참고이 문제를 해결하려면 더 우아한 방법하지만 어쩌면 나보다 같은 상황에서 사람을 도움이 될 수 있습니다 내 솔루션의 일부,

2

단순히 다른 스레드에서 timeintensive 물건을 할

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

'//Do stuff'은 예외를 던지므로 서비스를 중지하거나 크래킹하는 대신 삼켜 버릴 것입니다. 실제로 서비스가 작동하지 않고 "실행 중"이 아니라 실제로 아무것도하거나 제대로 작동하지 않는다는 것을 알 수 있습니다. . – deadlydog