C# Wpf调度程序计时器不稳定

C# Wpf调度程序计时器不稳定,c#,wpf,timer,dispatchertimer,C#,Wpf,Timer,Dispatchertimer,我有一个调度计时器,它必须像心跳一样每500毫秒运行一次,并在任意总线上的寄存器上写入。我已将其设置为最高优先级: m_HeartBeatTimer = new DispatcherTimer(DispatcherPriority.Render); 问题是,当程序运行时,有时时间间隔会大大延长,最长可达19秒: [20/06/2017 17:00:01.182]心跳1 79 [20/06/2017 17:00:20.669]心跳0 80 当然还有其他计时器和其他操作,但计时器不应该对这些操作不

我有一个调度计时器,它必须像心跳一样每500毫秒运行一次,并在任意总线上的寄存器上写入。我已将其设置为最高优先级:

m_HeartBeatTimer = new DispatcherTimer(DispatcherPriority.Render);
问题是,当程序运行时,有时时间间隔会大大延长,最长可达19秒:

[20/06/2017 17:00:01.182]心跳1 79

[20/06/2017 17:00:20.669]心跳0 80

当然还有其他计时器和其他操作,但计时器不应该对这些操作不敏感吗

有没有办法让它遵守正确的时间?
谢谢

.net有几种类型的计时器。Windows.Forms.Timer和Dispatchermer都在UI线程上运行。它们仅在UI线程不忙时才会勾选。。如果UI线程被锁定在某个任务中,则勾号将等待任务完成

如果你想要一个真实的心跳,那么我建议使用。这一个将在工作线程上打勾,所以请记住这一点

private System.Threading.Timer _timer;

private void go()
{
    _timer = new Timer(_ => Timer_Tick(), null, 0, 1000 * 10); //every 10 seconds
}

private void Timer_Tick()
{
  //this is not the main UI thread. Must invoke if you want to interact with the UI
}

.net有几种类型的计时器。Windows.Forms.Timer和Dispatchermer都在UI线程上运行。它们仅在UI线程不忙时才会勾选。。如果UI线程被锁定在某个任务中,则勾号将等待任务完成

如果你想要一个真实的心跳,那么我建议使用。这一个将在工作线程上打勾,所以请记住这一点

private System.Threading.Timer _timer;

private void go()
{
    _timer = new Timer(_ => Timer_Tick(), null, 0, 1000 * 10); //every 10 seconds
}

private void Timer_Tick()
{
  //this is not the main UI thread. Must invoke if you want to interact with the UI
}

Dispatchermer在UI线程上执行。计时器不保证在时间间隔出现时准确执行,但保证在时间间隔出现之前不会执行。我问的是另一个调度器。如果没有其他调度程序,则创建与UI线程的调度程序具有亲缘关系的调度程序,并在该线程(即UI线程)中执行其勾号处理程序。问问自己为什么这个类被称为Dispatchermer。对于您正在尝试做的事情,您可能最好使用其他计时器类之一。是的,谢谢!!!这可能是问题所在,因为另一个调度程序计时器正在执行其他操作,并以相同的间隔运行。你认为它会干扰吗?如果不使用调度计时器,我应该使用Windows.Forms.timer吗?其他
DispatchTimer
肯定会干扰。如果两者都在UI线程上运行,则在另一个计时器上完成的工作将同时阻塞UI和此计时器,直到其完成。我会在WPF应用程序中使用
System.Threading.Timer
而不是
Windows.Forms.Timer
,但如果可能的话,我更喜欢使用
async
而不是这两个选项。Dispatchermer是在UI线程上执行的,计时器不能保证在时间间隔发生时准确执行,但它们保证在时间间隔出现之前不会执行。我问的是另一个调度器。如果没有其他调度程序,则创建与UI线程的调度程序具有亲缘关系的调度程序,并在该线程(即UI线程)中执行其勾号处理程序。问问自己为什么这个类被称为Dispatchermer。对于您正在尝试做的事情,您可能最好使用其他计时器类之一。是的,谢谢!!!这可能是问题所在,因为另一个调度程序计时器正在执行其他操作,并以相同的间隔运行。你认为它会干扰吗?如果不使用调度计时器,我应该使用Windows.Forms.timer吗?其他
DispatchTimer
肯定会干扰。如果两者都在UI线程上运行,则在另一个计时器上完成的工作将同时阻塞UI和此计时器,直到其完成。在WPF应用程序中,我会在
Windows.Forms.Timer
上使用
System.Threading.Timer
,但如果可能的话,我更喜欢使用
async
而不是这两个选项。不,它不起作用。就像其他计时器一样被随机阻止。不,它不工作。与其他计时器一样被随机阻止。