在C#中如何创建一个与系统DateTime同步的计时器。每当DateTime.Now
的秒数发生变化时,自定义计时器都应该打勾答案 0 :(得分:4)
如果您在SO上查看以前的一些问题,您将很难获得计时器的准确性。以下是以前问题的一小部分示例:
以下是another previous question,可能会为您提供一些帮助。
答案 1 :(得分:0)
你想要的精度是多少?
如果你说1ms足够精确(或10或100),你总是可以做一个比较当前时间和上一次迭代保存的循环的循环,并在当前时间的秒值时启动一个线程价值变化......
答案 2 :(得分:0)
您可以使用一些计划库,例如Quartz.net,它提供了示例并且易于使用: http://quartznet.sourceforge.net/
答案 3 :(得分:0)
此代码使用System.Threading.Timer。它将查看触发器被调用的毫秒偏移量。如果误差超出可接受的范围,它将重新调整计时器,并通过平均每个刻度的误差来纠正间隔。
class Program {
const int MAX_ERROR_IN_MILLISECONDS = 20;
const int ONE_SECOND = 1000;
const int HALF_SECOND = ONE_SECOND / 2;
private static System.Threading.Timer timer;
static void Main(string[] args) {
timer = new System.Threading.Timer(Tick);
timer.Change(ONE_SECOND - DateTime.Now.Millisecond, ONE_SECOND);
Console.ReadLine();
}
private static int ticksSynced = 0;
private static int currInterval = ONE_SECOND;
private static void Tick(object s) {
var ms = DateTime.UtcNow.Millisecond;
var diff = ms > HALF_SECOND ? ms - ONE_SECOND : ms;
if (Math.Abs(diff) < MAX_ERROR_IN_MILLISECONDS) {
// still synced
ticksSynced++;
} else {
// Calculate new interval
currInterval -= diff / ticksSynced;
timer.Change(ONE_SECOND - ms, currInterval);
Console.WriteLine("New interval: {0}; diff: {1}; ticks: {2}", currInterval, diff, ticksSynced);
ticksSynced = 0;
}
Console.WriteLine(ms);
}
}
正如您所看到的,您无法完全触发Windows中的第二次更改。你可以试着靠近。