每隔一分钟运行DispatcherTimer

时间:2016-02-10 19:27:42

标签: c# .net wpf

以下调度程序每1分钟运行一次,从调用其 Start() 方法的时间算起......但我真正需要的是它在系统时间的每分钟组件的每次更改时打勾。任何的想法? 这是一个Windows应用程序(WPF)。

DispatcherTimer hourTimer = new DispatcherTimer(DispatcherPriority.Normal) 
{ 
    Interval = new TimeSpan(0, 1, 0) 
};
hourTimer.Tick += (sender,e) => { renderTime(); };
hourTimer.Start();

1 个答案:

答案 0 :(得分:2)

你无法获得"节拍器质量节拍"来自任何使用单个线程执行tick的计时器。这是因为当需要发生滴答时,线程可能会被阻塞。

您可以做的最好的事情是计算到下一个刻度的时间,并在刻度事件开始时重置持续时间。

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();