2013-10-17 16 views
7

Sto provando a convertire un'app console in un servizio Windows. Sto cercando di far sì che il metodo onstart del servizio chiami un metodo nella mia classe, ma non riesco a farlo funzionare. Non sono sicuro di farlo correttamente. Dove metto le informazioni sulla classe nel servizioC# Convertire l'app della console in servizio

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

Dal commento:

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

È stato modificato il tipo di progetto dall'applicazione console all'applicazione Windows? Stai chiamando 'ServiceBase.Run'? –

+0

Sì, ho creato un nuovo progetto nella mia soluzione come servizio di Windows. – user2892443

+0

namespace MyService { static class Programma di manutenzione { ///

/// Il punto di ingresso principale per l'applicazione. /// vuoto statico Principale() { ServiceBase [] ServicesToRun; ServicesToRun = new ServiceBase [] { new Service1() }; ServiceBase.Run (ServicesToRun); } } } – user2892443

risposta

8

Lo MSDN documentation su Windows Services è davvero buono e ha tutto il necessario per iniziare.

Il problema che si verifica è dovuto all'implementazione di OnStart, che dovrebbe essere utilizzata solo per configurare il servizio in modo che sia pronto per l'avvio, il metodo deve essere restituito tempestivamente. Di solito eseguirai la maggior parte del codice su un altro thread o in un timer. Vedi la pagina per OnStart per conferma.

Edit: Senza sapere che cosa il vostro servizio di Windows farà, è difficile dire come implementare, ma diciamo che si voleva eseguire un metodo ogni 10 secondi mentre il servizio è in esecuzione:

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

Qui, il metodo OnStart restituisce immediatamente dopo aver impostato il timer e TimerOnElapsed verrà eseguito su un thread di lavoro. Ho anche aggiunto una chiamata allo System.Diagnostics.Debugger.Launch(); che renderà il debug molto più facile.

Se hai altri requisiti, modifica la tua domanda o pubblica un commento.

+0

Questo è il mio problema, non sono sicuro di cosa mettere nell'implementazione di OnStart. Cosa intendi per mettere la maggior parte del codice su un thread o timer separato? Come sa il processo eseguire il mio codice se non viene chiamato da OnStart. Grazie in anticipo per la pazienza, I servizi sono completamente nuovi per me – user2892443

+1

@ user2892443 Modificato la mia risposta con un esempio. – ChrisO

2

Fatevi il più grande favore e utilizzare topshelf http://topshelf-project.com/ per creare il vostro servizio. Non c'è niente di più semplice che io abbia visto. La loro documentazione è supperb e la distribuzione non potrebbe essere più semplice. c:/percorso per l'installazione service/service.exe.

+1

Sebbene questo collegamento possa rispondere alla domanda, è meglio includere qui le parti essenziali della risposta e fornire il collegamento per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. - [Dalla recensione] (/ recensione/post di bassa qualità/18747979) – ViRuSTriNiTy