Ich suche eine Funktion in Silverlight, die Uhrzeit mit hoher Auflösung erfragen zu können.
DateTime.Now liefert leider nur eine Auflösung von ca. 16ms.
Bisheriges Googlen brachte im Wesentlichen nur zwei divergierende Meinungen an's Licht:
Es geht aus prinzipiellen Gründen nicht.
Storyboard.GetCurrentTime sei die Lösung.
Aber die Storyboard-Idee funktioniert bei mir überhaupt nicht, der Aufruf liefert weniger als 10mal in der Sekunde einen neuen Wert. Irgendeine Idee, was ich falsch mache? Ein funktionierendes Code-Snippet?
Was auch nicht geht: System.Threading.Timer mit sehr hohen Wiederholraten.
Das hier als Class verkapselt und den Tick event abonnieren. Dazu noch Code mit DateTime und TimeSpan zum auslösen des Tick events. Ist ungetestet, also: Klappt das? :)
public delegate void TickDelegate(); public event TickDelegate Tick; private Thread _timer; private void start() { _timer = new Thread( new ThreadStart(TimerThread) ); }
EDIT: Hab den Code mal geändert, so dass Tick alle X ms ausgelöst wird. Du musst aber darauf achten, dass Dein Code im Tick-Handler auch Zeit verbaucht. Das Polling-Interval ist also interval_in_ms + <Zeit für code in TimerThread> + <Zeit für code in allen Tick-handlern>
Genauere Berechnungen mit DateTime un TimeSpan sind auch möglich:
DateTime last = DateTime.Now; TimeSpan interval = new TimeSpan(0, 0, 0, 0, 10); // 10ms last = last.Add(interval); bool doTick = last > DateTime.Now;
Aber das Problem mit DateTime.Now hast Du noch nicht erfasst: Der Datentyp kann genauere Zeiten repräsentieren und damit rechnen aber *unter Silverlight* ist die Now Property auf 1/60 Sekunden quantisiert.
Die Differenz zweier Aufrufe von Now kann 16ms oder 33ms sein, aber nie 18ms oder 30ms!
Ich möchte meinen Code nicht öfter als 60 mal per Sekunde aufrufen, sondernich muss Zeiten mit einer größeren Genauigkeit als 1/60 Sekunde messen.