Ich frage mich, was die Genauigkeit der Timer-Klasse in System.Timers ist, denn es ist ein double (was darauf hindeuten würde, dass Sie Bruchteile von Millisekunden haben können). Wie hoch ist sie?
Antworten
Zu viele Anzeigen?Windows-Desktop-Betriebssysteme sind unter 40 ms nicht wirklich genau. Das Betriebssystem ist einfach nicht echtzeitfähig und weist daher erhebliche nicht-deterministische Schwankungen auf. Das bedeutet, dass es zwar Werte im Millisekundenbereich oder sogar darunter melden kann, dass man sich aber nicht darauf verlassen kann, dass diese Werte wirklich aussagekräftig sind. Also auch wenn das Timer-Intervall auf einen Wert im Sub-Millisekundenbereich eingestellt wird, können Sie sich nicht darauf verlassen, dass die Zeit zwischen Einstellung und Auslösung tatsächlich so ist, wie Sie es sich vorgestellt haben.
Hinzu kommt die Tatsache, dass das gesamte Framework, unter dem Sie laufen, nicht-deterministisch ist (die GC könnte Sie suspendieren und eine Sammlung durchführen, während der Timer ausgelöst werden sollte), und Sie enden mit Unmengen von Risiken, wenn Sie versuchen, etwas zu tun, das zeitkritisch ist.
System.Timers.Timer ist seltsam. Er verwendet ein Double als Intervall, ruft aber in Wirklichkeit Math.Ceiling auf und castet das Ergebnis als Int, um es mit einem zugrunde liegenden System.Threading.Timer zu verwenden. Die theoretische Genauigkeit beträgt dann 1ms und man kann kein Intervall angeben, das 2.147.483.647ms überschreitet. Angesichts dieser Informationen weiß ich wirklich nicht, warum ein Double als Intervallparameter verwendet wird.
Ich verglich System.Timers.Timer
y System.Threading.Timer
- beide ergeben systematische Fehler um 8..16 ms, insbesondere bei kleinen Intervallen (1000..6000 ms). Jeder nachfolgende Aufruf der Timer-Routine erfolgte mit einem größeren Intervall als der erste Aufruf. Ein Timer mit einem Intervall von 2000 ms wird beispielsweise in 2000, 4012, 6024, 8036, 10048 Millisekunden usw. ausgelöst (Die Zeitstempel stammen von Environment.TickCount
y Stopwatch.ElapsedTicks
, beide führen zu den gleichen Ergebnissen).
- See previous answers
- Weitere Antworten anzeigen