Frage

Ich habe einen Timer wie unten definiert.Der Timer führt eine lange Laufaufgabe aus.Das Problem, das ich habe, ist, wenn der Timer das Intervall wieder läuft, und eine andere Timer-Ausführung startet den i.e _timer_Elapsed.Wie kann ich den Timer abrufen, um ein Intervall auszuführen, nachdem der Timer abgeschlossen ist.Die Art und Weise, wie es jetzt ist, können mehrere Timer-Ausführungen auf einmal erfolgen, und dies verursacht alle möglichen Probleme mit meinem Code.

generasacodicetagpre.

War es hilfreich?

Lösung

lass uns richtig schreiben. Es ist die Intervallbelegung, die Sie in Schwierigkeiten bringen. Ein Beispielprogramm, das das Problem demonstriert:

generasacodicetagpre.

Ausgang:

generasacodicetagpre.

Entfernen Sie die Intervallzuordnung im abgelaufenen Ereignishandler, um den Unterschied zu sehen.

also, mit anderen Worten, obwohl die Autoreset-Eigenschaft FALSE ist, ist nur die Zuweisung der Intervalleigenschaft, um den Timer zum Neustart zu bringen. Große Überraschung natürlich sieht niemand jemals das kommt. Und es spielt Javoc auf Ihrem Programm, da Sie das Intervall-Eigenschaft frühzeitig zuweisen, vor Sie beginnen Sie mit dem schweren Anheben. Das verstrichene Ereignis wird also wieder auf einem anderen Thread angehoben, während Ihr vorheriges noch nicht abgeschlossen hat. Das ist ein Wärmefehler, der darauf wartet, insbesondere wenn Ihr Intervallwert zu klein ist. Sie müssen es später zuweisen, tun Sie dies in dem schließlich block. Gut, dass Sie das Intervall zu klein gemacht haben, sehr schwer zu diagnostizieren.

Ist das ein C # -Fehler?

Die C # -Suite ist aus dem Haken, dies ist ein .NET Framework-Fehler. System.timers.timer ist im Allgemeinen nur keine sehr gute Klasse, es hat die Benutzerfreundlichkeit einer Kettensäge ohne Sicherheitsschalter. Es sollte das System machen.Threading.Timer-Klasse nutzbarer, insbesondere das Problem mit der Gewohnheit, mit der Gewohnheit, dass der Müll zu früh gesammelt wurde. Ein Problem gelöst, aber drei neue Probleme hinzugefügt. Dies geht zurück zu .NET 1.0, eine Framework-Version mit Trainingsrädern. Sie können es einfach nicht mehr beheben, zu viel bestehender Code wird brechen. Sie sind wirklich besser mit dem System.Threading.timer, stellen Sie einfach sicher, dass das Objekt in einer Variablen referenziert wird. Wie du schon tust.

Andere Tipps

A 2017-Update:

Es gibt ein neues Werkzeug, das mit diesen Problemen nützlich sein kann.

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top