Ich habe eine System.Threading.Timer, die ihre entsprechenden Event-Handler (Callback) alle 10 ms aufruft. Die Methode selbst ist nicht reentrant und kann manchmal Weg länger als 10 ms nehmen. Daher möchte ich den Timer während der Ausführung der Methode stoppen.Stoppuhr in seiner Callback-Methode
Code:
private Timer _creatorTimer;
// BackgroundWorker's work
private void CreatorWork(object sender, DoWorkEventArgs e) {
_creatorTimer = new Timer(CreatorLoop, null, 0, 10);
// some other code that worker is doing while the timer is active
// ...
// ...
}
private void CreatorLoop(object state) {
// Stop timer (prevent reentering)
_creatorTimer.Change(Timeout.Infinite, 0);
/*
... Work here
*/
// Reenable timer
_creatorTimer.Change(10, 0);
}
MSDN besagt, dass die Callback-Methode (jedes Mal, wenn die Timer Feuer) in separaten Thread aus dem Thread-Pool genannt wird. Das bedeutet, dass, wenn ich den Timer stoppe, die erste Sache in der Methode es noch nicht notwendig verhindert, dass der Timer feuert und eine andere Instanz der Methode ausführt, bevor die erste eine Chance hatte, den Timer zu stoppen.
Sollte vielleicht der Timer (oder auch die nicht-reentrante Methode selbst) gesperrt sein? Was ist der richtige Weg, um zu verhindern, dass der Timer während der Ausführung seiner Callback-Methode (und nicht-reentrant) ausgelöst wird?
diese Frage können Sie http://stackoverflow.com/questions/1116249/manualresetevent-vs-thread-sleep – Kane