lunes, 27 de julio de 2009

¿Cómo hacer un Servicio Windows en C#? (Con timer)

Tenimos el servicio. Escribiendo al log. Unicamente:
public partial class MyNewService: ServiceBase
{
  public MyNewService()
   {
     InitializeComponent();
      if (!System.Diagnostics.EventLog.SourceExists("MySource"))
      {
      System.Diagnostics.EventLog.CreateEventSource(
      "MySource","MyNewLog");
     }
     eventLog1.Source = "MySource";
     eventLog1.Log = "MyNewLog";
    }


   protected override void OnStart(string[] args)
   {
      eventLog1.WriteEntry("In OnStart");
   }

   protected override void OnStop()
   {
      eventLog1.WriteEntry("In onStop.");
   }
 }

Bueno ahora hay que agregar un timer:
Pueden agregar un timer grafico o por codigo.
como agregarlo por código
Abran el archivo
MyNewService.Designer.cs
agreguen el código en la parte de abajo de su documento para definir el timer:

private System.Timers.Timer mytimer;

ahora busquen el evento
private void InitializeComponent()

agreguen esta definicion alli:
this.mytimer = new System.Timers.Timer();
((System.ComponentModel.ISupportInitialize)(this.mytimer)).BeginInit();

this.mytimer.Enabled = true;
this.mytimer.Interval = 2000D;
this.mytimer.Elapsed += new System.Timers.ElapsedEventHandler(this.mytimer_Elapsed);
((System.ComponentModel.ISupportInitialize)(this.mytimer)).EndInit();

ahora cambiemonos al servicio MyNewService
y busquemos el evento OnStart y agreguen la configuracion tal y como aparece abajo:

protected override void OnStart(string[] args)
{
eventLog1.WriteEntry("In OnStart");
this.mytimer.Elapsed += new System.Timers.ElapsedEventHandler(mytimer_Elapsed);
mytimer.Interval = 2000;
mytimer.Enabled = true;
}

agregue el siguiente evento:
en medio de este evento puede conectarse a la db o hacer lo que ustedes quieran.

private void mytimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
}

3 comentarios:

Terminal Mix dijo...

Muchas gracias por el aporte :D
Una duda: ¿se puede enviar el parámetro del Timer desde una aplicación externa?

Quiero decir, en lugar de especificar desde el código del servicio el timer, que se pueda especificar desde otra aplicación por si por momentos quiero que se ejecute cada 20 segundos, después de un tiempo quiero que sea cada 2 horas, etc.

Muchas gracias por compartir este tipo de información, los que vamos iniciando lo agradecemos muchísimo.

Mi BLOG dijo...

Y que te contestan verdad? jaja Nadie te pelo :(

Pero si alguien mas pasa por aqui, quizas se haga la misma pregunta, yo lo resolveria de la siguiente manera:

* En una base de datos
* En el registro de Windows (consultarlo cada TICK para ver si no cambio el Intervalo)

El como? .. mmm es la taréa a investigar con don google. :)

Fernando Diosquez dijo...

Si la otra es agregarte un archivo de configuracion..en donde guardas el valor.