2013-10-17 8 views
7

Próbuję przekonwertować aplikację konsoli na usługę systemu Windows. Próbuję mieć wbudowaną metodę usługi wywołania metody w mojej klasie, ale mogę, t wydaje się, aby to działało. Nie jestem pewien, czy robię to poprawnie. Gdzie mogę umieścić informacje klasa w służbieC# Konwertowanie aplikacji konsoli do usługi

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

Z komentarza:

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

Czy zmieniłeś typ projektu z aplikacji konsolowej na aplikację systemu Windows? Czy nazywasz 'ServiceBase.Run'? –

+0

Tak Stworzyłem nowy projekt w moim rozwiązaniu jako usługę Windows. – user2892443

+0

namespace MyService { Usługa klasy statycznejProgram { ///

/// Główny punkt wejścia do aplikacji. /// Wadą statyczną Main() { ServiceBase [] ServicesToRun; ServicesToRun = nowa ServiceBase [] { nowa usługa1() }; ServiceBase.Run (ServicesToRun); } } } – user2892443

Odpowiedz

8

Usługa MSDN documentation w usłudze Windows jest naprawdę dobra i ma wszystko, czego potrzeba, aby zacząć.

Problem, który masz z powodu swojej implementacji OnStart, który powinien być używany tylko do skonfigurowania usługi, aby był gotowy do uruchomienia, metoda musi zostać szybko zwrócona. Zazwyczaj uruchamiasz większość kodu w innym wątku lub w zegarze. Aby potwierdzić, patrz strona OnStart.

Edit: nie wiedząc, co usługa okna zrobi, to trudno powiedzieć, jak go wdrożyć, ale powiedzmy, że chciał uruchomić metodę co 10 sekund, podczas gdy usługa jest uruchomiona:

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; 
    } 
} 

W tym przypadku metoda OnStart powraca natychmiast po skonfigurowaniu licznika czasu, a TimerOnElapsed zostanie uruchomiony w wątku roboczym. Dodałem również wywołanie do System.Diagnostics.Debugger.Launch();, które znacznie ułatwi debugowanie.

Jeśli masz inne wymagania, edytuj swoje pytanie lub dodaj komentarz.

+0

To mój problem, nie jestem pewien, co umieścić w implementacji OnStart. Co masz na myśli umieścić dużą część kodu na osobnym wątku lub czasomierzu? W jaki sposób proces wie o uruchomieniu mojego kodu, jeśli nie został wywołany z OnStart. Z góry dziękuję za cierpliwość, Usługi są dla mnie całkowicie nowe – user2892443

+1

@ user2892443 Zmieniono moją odpowiedź na przykładzie. – ChrisO

2

Zrób sobie przysługę i największy używać Topshelf http://topshelf-project.com/ stworzyć swoją usługę. Nie ma nic łatwiejszego, co widziałem. Ich dokumentacja jest kolacją i wdrożenie nie może być prostsze. c:/ścieżka do instalacji service/service.exe.

+1

Podczas gdy ten link może odpowiedzieć na pytanie, lepiej umieścić w nim istotne części odpowiedzi i podać link do odsyłacza. Odpowiedzi dotyczące linków mogą stać się nieprawidłowe, jeśli strona z linkami się zmieni. - [Z recenzji] (/ recenzja/niskiej jakości-posts/18747979) – ViRuSTriNiTy

Powiązane problemy