需要一个可靠的计时器来每秒发射192次事件

时间:2013-05-16 17:21:23

标签: c# timer

我已经尝试过Dispatcher计时器但它似乎没有正常工作。

我设置了tick事件,每个tick都会添加一个tick计数器,而这只是没有正确的工作。我还有一个秒表来计算它已经存在了多长时间,并且数字不匹配。请让我知道什么样的解决方案每秒给我192个滴答。

    Stopwatch sw = new Stopwatch();
    public DispatcherTimer dt = new DispatcherTimer();
    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromMilliseconds(1000/192);
    dt.Start();
    sw.Start();

void dt_Tick(object sender, EventArgs e)
{
    tick_textbox.Text = tick_counter.ToString();
    seconds_textbox.Text = sw.Elapsed.ToString();
    tick_counter++;
}

现在,我已经将它降低到每秒8次,这应该可以解决分辨率问题,但是使用TimeSpan.FromSeconds和TimeSpan.FromMilliseconds的间隔会产生截然不同的结果:

    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromSeconds(2 / 16);
    dt.Start();

VS。

    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromMilliseconds(2000 / 16);
    dt.Start();

这是什么原因?

1 个答案:

答案 0 :(得分:8)

你要求每5ms发生一次事件,并且.NET计时器在此分辨率下根本不可靠

http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=815

来自文章:

  

我从我的所有测试中得出的结论是,在最好的情况下,你可以指望一个计时器在其目标时间的15毫秒内打勾。计时器在其目标时间之前打勾是很少见的,我从未看到它超过一毫秒。最坏的情况似乎是计时器将在目标时间的30毫秒内打勾。通过获取所需的目标频率(即每100毫秒一次),向上舍入到下一个15的倍数,然后再加上15来计算最坏的情况。因此,如果没有非常大的CPU负载阻止正常处理,则会产生100 ms的定时器。每99至120毫秒一次。

     

使用这些计时器肯定无法获得比15毫秒更好的分辨率。如果您希望更频繁地发生某些事情,则必须找到不同的通知机制。没有.NET计时器对象可以做到。

方式来获得此分辨率,但它们通常涉及专为高频定时应用程序设计的特定硬件以及用于其事件的驱动程序互操作。在使用acousto-optic modulator激光光源和CCD之前,我已经完成了这项工作。