2016-05-12 10 views
0

Derzeit hat ich Funktionen in meinem Dienst, die in verschiedenen Threads auf Timer-Ereignisse aufgerufen werden (alle 10 Minuten) in Fenstern Service in 4.0 Framework wie folgt geschrieben:anderer Thread in mit verschiedenen Timer in Windows-Dienst

 public void OnTimer(object sender, System.Timers.ElapsedEventArgs args) 
     { 
       Task.Factory.StartNew(() => ABC()); 
       Task.Factory.StartNew(() => DEF()); 
       Task.Factory.StartNew(() => GHI()); 
       Task.Factory.StartNew(() => IJK()); 
       Task.Factory.StartNew(() => LMN()); 
     } 

Ich möchte für jeden Thread ein anderes Zeitintervall/Timer-Ereignis haben. Eine mögliche Lösung besteht darin, ein neues Zeitgeberobjekt zu erstellen und jede Funktion in einem anderen Zeitgeberereignis aufzurufen. Gibt es einen anderen optimierten Weg? Wenn der Dienst in Zukunft 50 Funktionen enthält, müsste ich 50 Timerobjekte erstellen.

Antwort

1

Edit: Others have pointed out, dass sie Hunderte von einzelnen Timern in einer Anwendung verwendet haben. Wenn die Anzahl der Timer keine Systembeschränkung ist, weiß ich nicht, ob es die zusätzliche Komplexität wert wäre, einen Timer für mehrere Intervalle zu verwenden.


Erstellen Sie einen Timer, der jede Minute abläuft. (Das Intervall ist beliebig, aber eine Minute ist möglicherweise einfacher zu bearbeiten.)

Wenn es abgelaufen ist, bestimmen Sie die Gesamtzahl der verstrichenen Minuten. Sie könnten das tun, mit

var elapsedMinutes = (DateTime.Now - _startTime).TotalMinutes 
// where _startTime is when the timer started 

Dann zum Beispiel, wenn

(_elapsedMinutes % 10) == true 
(_elapsedMinutes % 3) == true 

Dann wird der Timer in einem Intervall von 10 Minuten oder 3 Minuten verstrichen ist. Ein Fehler besteht darin, dass je nachdem, wie lange es zwischen dem Ablauf des Timers und dem Neustart dauert, einige Millisekunden verloren gehen können, die sich über einen langen Zeitraum zu einer Minute summieren könnten und Sie schließlich eine Minute überspringen könnten. Wenn das ein Problem ist, dann könnten Sie dies berücksichtigen, indem Sie ein paar Sekunden vom Timerintervall abschneiden, wenn der Sekundenanteil der verstrichenen Zeit fast eine ganze Minute lang schleicht. (Das ist ein bisschen unordentlich.)

Verwandte Themen