Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 每分钟运行一次Dispatchermer_C#_.net_Wpf - Fatal编程技术网

C# 每分钟运行一次Dispatchermer

C# 每分钟运行一次Dispatchermer,c#,.net,wpf,C#,.net,Wpf,下面的dispatcher每1分钟运行一次,从调用它的Start()方法开始计时……但我实际需要的是,它在系统时间的分钟部分的每一次更改上都打勾。有什么想法吗? 这是一个windows应用程序(WPF) 你不能从任何使用单个线程来执行节拍器的计时器中获得“节拍器质量节拍”。这是因为当需要进行勾选时,线程可能会被阻塞 您所能做的最好的事情是计算到下一个滴答声的时间,并在滴答声事件开始时重置持续时间 var now = DateTime.UtcNow; var nextMinute = now.Ad

下面的dispatcher每1分钟运行一次,从调用它的Start()方法开始计时……但我实际需要的是,它在系统时间的分钟部分的每一次更改上都打勾。有什么想法吗? 这是一个windows应用程序(WPF)

你不能从任何使用单个线程来执行节拍器的计时器中获得“节拍器质量节拍”。这是因为当需要进行勾选时,线程可能会被阻塞

您所能做的最好的事情是计算到下一个滴答声的时间,并在滴答声事件开始时重置持续时间

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