2013-10-17 32 views
7

Bir konsol uygulamasını bir Windows hizmetine dönüştürmeye çalışıyorum. Hizmetin başlangıç ​​yöntemini benim sınıfımda bir yöntem çağırmaya çalışıyorum ama işe yarayacak gibi görünmüyorum. Bunu doğru yaptığından emin değilim. do nereden comment itibaren hizmetteC# Konsol Uygulamasını Servise Dönüştürme

protected override void OnStart(string[] args) 
{ 
    EventLog.WriteEntry("my service started"); 
    Debugger.Launch(); 
    Program pgrm = new Program(); 
    pgrm.Run(); 
} 

sınıf bilgilerini koydu:

namespace MyService { 
static class serviceProgram { 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    static void Main() { 
    ServiceBase[] ServicesToRun; 
    ServicesToRun = new ServiceBase[] { 
    new Service1() 
    }; 
    ServiceBase.Run(ServicesToRun); 
    } 
} 
} 
+0

Proje türünü Konsol Uygulamasından Windows Uygulamasına değiştirdiniz mi? ServiceBase.Run'unu mu arıyorsun? –

+0

Evet Çözümümde Windows hizmeti olarak yeni bir proje oluşturdum. – user2892443

+0

namespace MyService { statik sınıf serviceProgram uygulaması için { ///

/// ana giriş noktası. /// statik geçersiz Ana() { ServiceBase [] ServicesToRun; ServicesToRun = yeni ServiceBase [] { yeni Service1() }; ServiceBase.Run (ServicesToRun); } } } – user2892443

cevap

8

Windows Services'teki MSDN documentation gerçekten çok iyi ve başlamak için ihtiyacınız olan her şeye sahiptir.

Yapmakta olduğunuz sorun, OnStart uygulamanızın nedeni, yalnızca hizmeti başlatmak için kullanılmaya başlanması, bu nedenle, başlatmaya hazır olması, yöntemin hemen dönmesi gerekir. Genellikle kodun bir kısmını başka bir iş parçacığında veya bir zamanlayıcıda çalıştırırsınız. Onay için OnStart sayfasına bakın.

Düzenleme: Windows hizmet ne yapacağını bilmeden , bu hizmeti çalıştıran her 10 saniyede ederken nasıl bunu uygulamak için size ancak Diyelim ki bir yöntemi çalıştırmak istiyorum diyelim zor:

public partial class Service1 : ServiceBase 
{ 
    private System.Timers.Timer _timer; 

    public Service1() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnStart(string[] args) 
    { 
#if DEBUG 
     System.Diagnostics.Debugger.Launch(); // This will automatically prompt to attach the debugger if you are in Debug configuration 
#endif 

     _timer = new System.Timers.Timer(10 * 1000); //10 seconds 
     _timer.Elapsed += TimerOnElapsed; 
     _timer.Start(); 
    } 

    private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) 
    { 
     // Call to run off to a database or do some processing 
    } 

    protected override void OnStop() 
    { 
     _timer.Stop(); 
     _timer.Elapsed -= TimerOnElapsed; 
    } 
} 

Burada, zamanlayıcı ayarlandıktan hemen sonra OnStart yöntemi döndürülür ve bir çalışan iş parçacığı üzerinde TimerOnElapsed çalışır. Ayrıca hata ayıklama işlemini kolaylaştıracak System.Diagnostics.Debugger.Launch(); numaralı telefona bir çağrı ekledim.

Başka gereksinimleriniz varsa, lütfen sorunuzu düzenleyin veya yorum gönderin.

+0

Bu benim sorunum, OnStart Uygulamasında ne koymak istediğinizden emin değilim. Ne demek, kodun büyük kısmını ayrı bir iş parçacığına veya zamanlayıcıya koymak? Süreç, OnStart'tan çağrılmadığında kodumu çalıştırmayı nasıl biliyor? Sabrınız için şimdiden teşekkür ederiz, Hizmetler tamamen bana yeni – user2892443

+1

@ user2892443 Cevabımı bir örnekle düzenledim. – ChrisO

2

Kendinize büyük iyilik yapın ve hizmetinizi oluşturmak için topshelf http://topshelf-project.com/ kullanın. Gördüğüm daha kolay bir şey yok. Onların belgeleri supperb ve dağıtım basit olamazdı. c:/service/service.exe yüklemesi.

+1

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel parçalarını buraya eklemek ve başvuru için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir. - [Yorum yaz] (/ review/düşük kaliteli yazılar/18747979) – ViRuSTriNiTy