Sie irren sich in dem Sinne, dass kein neuer Thread erstellt wird, wenn das Ereignis Elapsed
ausgelöst wird. Das Ereignis wird im .NET-Threadpool ausgelöst, sodass ein beliebiger Thread es verarbeiten kann.
Eine Möglichkeit zu tun, was Sie wollen, ist Stop
der Timer am Anfang Ihres Event-Handler und Start
es wieder einmal, wenn es fertig ist. Wie folgt aus:
var timer = new System.Timers.Timer(1000);
timer.Elapsed += HandleTimerElapsed;
timer.Start();
...
private void HandleTimerElapsed(object s, ElapsedEventArgs e)
{
var t = (System.Timers.Timer)s;
t.Stop();
try {
... do some processing
}
finally { // make sure to enable timer again
t.Start();
}
}
Die andere Option ist die AutoReset
Eigenschaft des Timers auf false gesetzt. Auf diese Weise wird der Timer nur einmal ausgelöst. Dann können Sie Start
aufrufen, wenn Sie es erneut starten möchten. Also würde sich der obige Code so ändern, dass er am Anfang einen timer.AutoReset = false;
enthält und Sie dann innerhalb des Handlers nicht Stop
aufrufen müssen. Dies ist ein wenig sicherer, da das obige Verfahren wahrscheinlich eine Wettlaufsituation in dem Sinne hat, dass, wenn das System unter Last ist, Ihr Handler nicht garantiert ausgeführt wird, bevor der Zeitgeber erneut abläuft.
thread.Join() // Wartet hier, bis der Thread fertig ist. http://stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net – MrFox
Müssen Sie einen Timer verwenden? Können Sie nicht einfach den Thread loopen und am Ende berechnen, wie viele ms bis zum nächsten Durchlauf und, wenn positiv, für diese Zeit schlafen? –
@Martin James- Ich benutze diese Anwendung als Windows-Dienst, so würde ich gerne Timer und Noe verwenden, während (True) -Schleife, @ MrFox wie gesagt Ich benutze Timer ... – MoShe