C# 每分钟运行一次Dispatchermer
下面的dispatcher每1分钟运行一次,从调用它的Start()方法开始计时……但我实际需要的是,它在系统时间的分钟部分的每一次更改上都打勾。有什么想法吗? 这是一个windows应用程序(WPF) 你不能从任何使用单个线程来执行节拍器的计时器中获得“节拍器质量节拍”。这是因为当需要进行勾选时,线程可能会被阻塞 您所能做的最好的事情是计算到下一个滴答声的时间,并在滴答声事件开始时重置持续时间C# 每分钟运行一次Dispatchermer,c#,.net,wpf,C#,.net,Wpf,下面的dispatcher每1分钟运行一次,从调用它的Start()方法开始计时……但我实际需要的是,它在系统时间的分钟部分的每一次更改上都打勾。有什么想法吗? 这是一个windows应用程序(WPF) 你不能从任何使用单个线程来执行节拍器的计时器中获得“节拍器质量节拍”。这是因为当需要进行勾选时,线程可能会被阻塞 您所能做的最好的事情是计算到下一个滴答声的时间,并在滴答声事件开始时重置持续时间 var now = DateTime.UtcNow; var nextMinute = now.Ad
var now = DateTime.UtcNow;
var nextMinute = now.AddTicks(-(now.Ticks%TimeSpan.TicksPerMinute)).AddMinutes(1);
DispatcherTimer hourTimer = new DispatcherTimer(DispatcherPriority.Normal)
{
Interval = nextMinute - DateTime.UtcNow
};
hourTimer.Tick += (sender, e) =>
{
var correctionNow = DateTime.UtcNow;
var timeCorrection = correctionNow.AddTicks(-(correctionNow.Ticks % TimeSpan.TicksPerMinute)).AddMinutes(1);
hourTimer.Interval = timeCorrection - DateTime.UtcNow;
renderTime();
};
hourTimer.Start();
您可以睡眠
DateTime.Now.AddSeconds(60-DateTime.Now.Seconds)
然后启动计时器。DateTime.UtcNow比DateTime快。现在,时区计算需要几毫秒。当您进行时长计算时,您应该始终尝试使用UtcNowScott。我尝试了您的方法,并得到“时间跨度周期必须大于或等于零”hourTimer.Interval=timeCorrection-DateTime.UtcNow;中出现异常;。不会总是DateTime.UtcNow大于timeCorrection?由于AddMinutes
采用double
而产生的舍入错误可能会导致此问题。我认为发生的事情是,AddMinutes
导致时间比下一分钟短了几分钟,所以当它缩短时间时,它将时间设置回相同的开始时间。试试我更新的计算下一分钟的版本,我截短秒数,然后在时间上加上一分钟。不精确的是,它现在正好在分钟分量改变的时刻滴答作响。谢谢
var now = DateTime.UtcNow;
var nextMinute = now.AddTicks(-(now.Ticks%TimeSpan.TicksPerMinute)).AddMinutes(1);
DispatcherTimer hourTimer = new DispatcherTimer(DispatcherPriority.Normal)
{
Interval = nextMinute - DateTime.UtcNow
};
hourTimer.Tick += (sender, e) =>
{
var correctionNow = DateTime.UtcNow;
var timeCorrection = correctionNow.AddTicks(-(correctionNow.Ticks % TimeSpan.TicksPerMinute)).AddMinutes(1);
hourTimer.Interval = timeCorrection - DateTime.UtcNow;
renderTime();
};
hourTimer.Start();