2010-04-07 8 views
5

Mi pregunta es si esta es la mejor práctica para hacer esto. No pude encontrar ningún buen ejemplo. He siguiente código en el archivo creado por VS2005:cómo implementar el bucle de servicio de Windows que espera un período en C#/.NET2.0

public partial class ObjectFolder : ServiceBase 
{ 
    protected override void OnStart(string[] args) 
    { 
     ObjectFolderApp.Initialize(); 

     ObjectFolderApp.StartMonitorAndWork(); 
    } 

    protected override void OnStop() 
    { 
     // TODO: Add code here to perform any tear-down necessary to stop yourservice. 
    } 
} 

a continuación:

class ObjectFolderApp 
{ 
    public static bool Initialize() 
    { 
     //all init stuff 
     return true; 
    } 


    public static void StartMonitorAndWork() 
    { 
     Thread worker = new Thread(MonitorAndWork); 
     worker.Start(); 
    } 


    private static void MonitorAndWork() 
    { 
     int loopTime = 60000; 
     if (int.TryParse(_cfgValues.GetConfigValue("OfWaitLoop"), out loopTime)) 
      loopTime = 1000 * loopTime; 

     while (true) 
     { 
      /* create+open connection and fill DataSet */ 
      DataSet ofDataSet = new DataSet("ObjectFolderSet"); 
      using (_cnctn = _dbFactory.CreateConnection()) 
      { 
       _cnctn.Open(); 

       //do all kinds of database stuff 
      } 
      Thread.Sleep(loopTime); 
     } 
    } 
} 

Respuesta

14

Re-hash mi respuesta de this question, el método recomendado es utilizar un temporizador y el siguiente código:

public class MyService : ServiceBase 
{ 
    private Timer workTimer; // System.Threading.Timer 

    protected override void OnStart(string[] args) 
    { 
     workTimer = new Timer(new TimerCallback(DoWork), null, 5000, 5000); 
     base.OnStart(args); 
    } 

    protected override void OnStop() 
    { 
     workTimer.Dispose(); 
     base.OnStop(); 
    } 

    private void DoWork(object state) 
    { 
     RunScheduledTasks(); // Do some work 
    } 
} 

simple!

Tenga en cuenta que el tipo Timer que se utiliza es System.Threading.Timer, igual que Justin especifica.

+1

El código anterior funciona como un amuleto. Estoy usando un servicio de Windows para verificar una cola. –

+0

gracias! ... hmmm ... así que sugieres que ni siquiera llamo a ObjectFolderApp.Initialize(); en OnStart ?? Tiene que ser inicializado solo una vez. Otra pregunta es llamar a los métodos básicos anulados. ¿Porqué es eso? –

+0

@matti: No sé qué estás haciendo en 'Initialize', por lo que es difícil de decir. Puede que aún lo necesite. En cuanto a llamar a los métodos base, no necesariamente tiene que hacerlo, pero como regla general, es una buena idea si lo que intenta hacer es * extender * la lógica de la clase base en lugar de * reemplazar * (que es la semántica deseada aquí). – Aaronaught

3

Utilice un System.Threading.Timer para disparar el proceso de apagado en el intervalo programado.

+0

De acuerdo. 'Thread.Sleep()' es un signo de un mal diseño. – Kimi

+0

@al: ¿por qué Thread.Sleep es malo? –

Cuestiones relacionadas