2008-10-19 21 views

cevap

35

Hizmetinizi en hızlı şekilde başlatmak için iyi bir yöntemdir. Yani, sırasında durumunu başlatın, sadece başarılı bir şekilde başladığını kabul etmeniz gerekenleri yapın; ve sonra dinlenin. başlangıç ​​ hala uzun bir süreç ise, henüz bitmemiş olan Servis Kontrol Yöneticisi bilgilendirmek için periyodik olarak SetServiceStatus kullanın, bu yüzden hizmetiniz zaman aşımına uğramaz.

+10

Ayı aklınızda olsa bile, kendi başına bir başka hizmetiniz varsa, SERVICE_RUNNING gönderdiğinde hizmetinizin tamamen işlevsel olmasını bekleyebilirsiniz. Bu, SERVICE_RUNNING mesajını göndermeden önce, başlatma işleminizin _all_'ini tamamlamanız ve gerekiyorsa SetServiceStatus ile daha fazla zaman istemeniz için iyi bir nedendir. –

78

Hizmete en kısa sürede başlamayı bitirmek için Romulo'ya katılıyorum. Ancak, zamana ihtiyacınız varsa ve .NET Framework 2.0 veya sonraki sürümünü kullanıyorsanız, ServiceBase.RequestAdditionalTime() yöntemini düşünebilirsiniz.

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

Teşekkürler, bu bana çok yardımcı oldu! Bazı eski kodlarım var ve onu çalıştırmak için gerekiyor ... – Turrau

+0

Uyarı, olası uyarı: "HostControl için belgeler.RequestAdditionalTime durumu başarısız olursa en fazla 60 veya 120 saniye isteyebilirsiniz. Aksi takdirde isteğinizi göz ardı eder. "(Buradan: https://stackoverflow.com/questions/19589686/topshelf-timeout-issue, doğrulanmadı, ama dikkate almaya değer) –

1

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

Ben de may iyi Başlat sağlamanın birkaç saniye/dakika sürer bir hizmet ile uğraşmak zorunda kaldı. Hizmet başladığında, bir SQL Server'a bağlanmaya çalışır. Ancak, tüm sunucu yeniden başlatıldığında hizmetim SQL Server ÖNCE başlıyordu. (Hizmet bağımlılığı hakkında bilgim var ama benim durumum için belli bir nedenden dolayı geçerli değil ....). SQL Server'a bağlanmak için 10 kez denemeye çalışan bir döngü yapmayı denedim, ancak Windows Zaman Aşımı nedeniyle 2. denemeden önce hizmetimi öldürüyordu.

Çözümüm: Hizmetimin "onStart()" bölümüne bir Zamanlayıcı ekledim. Ardından, hizmetin "onTick()" yöntemi, SQL Server'a bağlanmak için 10 kez çalışıyordu (30'unda beklemeyle). Başlangıçta zaman aşımı yok.

Yani temelde

,

  • hizmetim 5 saniye içinde başlayacak.
  • Hizmetin başlatılmasından 10 saniye sonra bir zamanlayıcı başlatılır.
  • Zamanlayıcı, SQL Server'a bağlanmak için 10 kez [her seferinde 30 saniye bekletme] 'a bağlanır.
  • Eğer başarılı olursa, zamanlayıcı kendini devre dışı bırakır (eğer 10 denemeden sonra), servisi durdururum.

Not sorunu çözmek için daha şık bir yol ama belki benden daha aynı durumda kimseye yardımcı olabilir benim çözümün bir kısmı,

2

Basitçe başka bir iş parçacığı timeintensive şeyler

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

Burada dikkatli olmalısınız çünkü eğer// Bir şeyler bir istisna atar, servisin durması/kilitlenmesi yerine yutulacaksınız, ki bunun yerine hizmetin çalışmadığını bilmeniz, bunun yerine "koşmak" yerine, bir şey yapmamak ya da düzgün bir şekilde çalışmak yerine . – deadlydog