2012-04-07 8 views
2

Ich verwende System.Timers in meinem Programm.Wie kann ich das System erzwingen, einen neuen Thread zu erstellen, wenn der vorherige Thread noch läuft?

Wie wir jedes Intervall wissen, wird neuer Thread erstellt, um die OnTimedEvent zu behandeln.

Ich bin auf der Suche nach Weg, um das System zu warten, um einen neuen Thread zu erstellen, wenn der vorherige Thread noch ausgeführt wird.

Mein OnTimedEvent eine Methode auszuführen, und ich würde das Verfahren warten möchten, bis

Jede Idee ist abgeschlossen, wie das zu tun?

+0

thread.Join() // Wartet hier, bis der Thread fertig ist. http://stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net – MrFox

+0

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? –

+0

@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

Antwort

2

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.

+0

sehr gut Idea- Danke! – MoShe

Verwandte Themen