2016-10-25 11 views
1

Gibt es eine Möglichkeit, die Timer so zu starten, dass sie genau auf die volle Sekunde startet?C# timer start bei genau voller Sekunde

stateTimer = new Timer(someCallback, null, 0, 1000); 

wird dieses man sofort beginnen, jede Sekunde wiederholen, aber das Problem ist es genau beginnt, wenn ich das Programm ausführen, die in 13:14:15.230 Start führen kann.

Ich möchte 13:14:15.000 starten. Etwas wie:

stateTimer = new Timer(someCallback, null, DateTime.Now.Date, 1000); 

Ist das möglich?

EDIT:

Nachdem das Konsolenprotokoll tun:

Console.WriteLine($"Time: {DateTime.Now.ToString("HH:mm:ss.fff")}"); 

Ich habe bemerkt, dass 1 Sekunde Intervall von tatsächlich mehr als eine Sekunde (etwa 1,02 jede Iteration), so erhöht wird nach 50 Iterationen wird eine Sekunde übersprungen. Ich habe mein Problem gelöst, indem ich den Timer alle 800ms laufen lasse. Keine ideale Lösung, aber es funktioniert, und zweitens wird nie übersprungen (und ich habe kein Problem, die gleiche Sekunde zweimal auszulösen).

stateTimer = new Timer(someCallback, null, 0, 800); 
+3

Warum ist es ein Problem, wenn der Timer nicht genau auf den zweiten läuft? – ChrisF

+1

Sie könnten berechnen, wie lange Sie das nächste Mal starten und so viel schlafen möchten, dann starten Sie es, aber seien Sie sich bewusst, dass Windows kein Echtzeitbetriebssystem ist, es gibt keine Garantie dafür, dass Ihr Timer genau tickt das von Ihnen angegebene Zeitintervall, nur "nahe genug". Warum brauchst du das genau? –

+0

Eine "zweite" ohne Bruchteil ist ein imaginärer oder theoretischer Begriff, und es ist völlig willkürlich. Was eine Person (oder ein Computer) denkt, ist eine exakte/volle Sekunde, eine andere denkt, dass sie mitten in zwei Sekunden ist, weil es unmöglich ist, die beiden zu synchronisieren. Sofern Sie nicht erklären können, warum dies notwendig oder nützlich ist, ist diese Frage in Ihrem Fall nicht von Wert. –

Antwort

6

Nein, das ist nicht möglich. Das würde erfordern, dass Sie genau wissen, wann die CPU es für eine gute Idee hält, mit der Ausführung Ihres Timer-Codes zu beginnen. Selbst wenn Sie für die verbleibende Zeit Thread.Sleep würden, würde es immer noch nicht bedeuten, dass der Code genau zur Millisekunde ausgeführt wird, die Sie möchten.

Wenn Sie dies nur für die Formatierung tun möchten, können Sie stattdessen ein benutzerdefiniertes Datums-/Uhrzeitformat verwenden.