2012-06-28 17 views
10

In che ordine si verificano le chiamate di metodo in un servizio di Windows? Stiamo avendo un problema di temporizzazione e penso che sia dovuto al fatto che il costruttore impiega troppo tempo per completare l'elaborazione.Ordine di chiamate di metodi in un servizio di Windows

Si tratta di un problema analogo che penso stiamo avendo Error 1053 the service did not respond to the start or control request

Tuttavia, siamo meraviglia in quale ordine e quando i principali metodi, OnStart, InitializeComponent ecc vengono chiamati e/o quando dovrebbero essere chiamati.

Inoltre, il metodo OnStart sarebbe il posto migliore in cui inserire tutta l'elaborazione?

** Soluzione

fatto un po 'di tempo per fare un servizio di prova e testati le risposte qui sotto e scoperto il tempo fuori è venuta dalla lavorazione metodo Main così come il costruttore viene chiamato nel metodo Main inducendolo a tempo scaduto. Spostare tutto su OnStart oltre a girare un filo sembrava funzionare. Dettagli qui. http://www.adamthings.com/post/2012/06/28/error-1053-the-service-did-not-respond-to-the-start-or-control-request-in-a-timely-fashion/

+0

OnStart dovrebbe avviare un altro thread che gestisca tutta l'elaborazione, in modo che il metodo possa tornare immediatamente. Nella mia esperienza questo funziona meglio. Non metterei nulla in InitializeComponent. – Mangist

+0

OnStop deve interrompere la discussione e attendere che si completi :) – Mangist

+1

È possibile trovare mettendo i punti di interruzione. – usr

risposta

6

Non bloccare nel metodo OnStart(). Sembra che tu stia facendo questo.

Creare una discussione separata nel metodo OnStart() e uscire da lì.

non ho ancora testato questo, ma qualcosa di simile a:

protected override void OnStart(string[] args) 
{ 
    var worker = new Thread(DoWork); 
    worker.IsBackground = false; 
    worker.Start(); 

    base.OnStart(args); 
} 

private void DoWork() 
{ 
    while (!_stopRequested) // (set this flag in the OnStop() method) 
    { 
     // processing goes here 
    } 
} 

Per rispondere alla tua domanda circa l'ordine degli eventi, dichiarazioni traccia solo di configurazione in ogni metodo. Non sono sicuro di quanto sarà utile. Il messaggio (il servizio non ha risposto alla richiesta di avvio ...) che stai ricevendo è indicativo di blocco (o di troppo tempo) in un metodo che dovrebbe essere eseguito in tempi relativamente brevi.

+0

Questo è stato di grande aiuto per far muovere i miei pensieri. Grazie per la risposta. Inserito i miei risultati nei commenti sul post originale. – Adam

6

Credo che l'ordine è

Per quanto riguarda il punto in cui inserire il codice, suggerirei di inserire qualsiasi codice che possa essere memorizzato nella cache in Main e qualsiasi codice che ricicla ad ogni avvio all'interno di OnStart. Tuttavia, non devi eseguire alcuna elaborazione effettiva in OnStart, solo l'inizializzazione. Utilizzare un thread separato per eseguire la maggior parte della logica.

Inoltre, il MSDN is helpful with this

+0

Grazie per la risposta , è stato utile. Inserito i miei risultati nei commenti sul post originale. – Adam

Problemi correlati