2012-04-04 6 views
1

Ich möchte einen Timer anstelle von Schlaf in einem Windows-Dienst verwenden, die eine Aktion in einem konstanten Intervall durchführen sollte.mit Timer innerhalb Windows-Dienst

Lets sagen, dass ich die folgende Klasse habe.

class MailManagerClient 
{ 

    //fields 
    string someString 

    //Constructor 
    public MailManagerClient() 
    { 
      aTimer = new System.Timers.Timer(30000); 
      aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 
      aTimer.Enabled = true 
    } 
    //methode 

    public bool DoSomthingIncConstantInterval() 
    { 
     //Do Somthing 
     return true; 
    } 


    private static void OnTimedEvent(object source, ElapsedEventArgs e) 
    { 
     DoSomthingIncConstantInterval() 
    } 
} 

Und ich habe auch einen Windows-Dienst mit der OnStart Methode.

Ich verstehe, dass in der OnStart Methode muss ich einen neuen Thread für den Typ MailManagerClient starten.

Aber wie starte ich den Thread? Welche Methode sollte der Einstiegspunkt für den neuen Thread sein?

Wie soll der Thread am Leben bleiben?

+0

Vielleicht sollten Sie quartz.net anschauen, ich denke, es wird Ihrem Zweck viel besser dienen. – alxbrd

+0

Observable.Timer in [System.Reactive.Linq] (http://msdn.microsoft.com/en-us/library/hh229435 (v = vs.103) .aspx) ist etwas anderes zu prüfen. –

Antwort

1

Da Sie den Timer im Konstruktor als alle brauchen Sie wirklich beginnen, eine MailManagerClient in OnStart zu tun ist, instanziiert. Sie müssen einen Thread nicht manuell erstellen, da System.Timers.Timer den Ereignishandler Elapsed für einen Thread aus der ThreadPool ausführt.

public class MyService : ServiceBase 
{ 
    private MailManagerClient mmc = null; 

    protected void OnStart(string[] args) 
    { 
    mmc = new MailManagerClient(); 
    } 

} 

Ich mag darauf hinweisen, dass es nicht auf den nächsten Programmierer offensichtlich sein würde, auf dem Code sucht, dass MailManagerClient.ctor tatsächlich etwas zu tun ist. Es wäre besser, eine Start Methode oder etwas Ähnliches zu definieren, das den internen Timer aktiviert.

1

Im OnStart Methode könnten Sie haben -

MailManagerClient m; 
var th = new Thread(()=>m=new MailManagerClient()); 
th.Start(); 
1

Sie können auch eine Windows-Task definieren, wie in dieser SO-Antwort erläutert: What is the Windows version of cron?. Das Windows-Betriebssystem kümmert sich um die Planung und das Threading.