C# 需要一个可靠的计时器每秒触发192次事件

C# 需要一个可靠的计时器每秒触发192次事件,c#,timer,C#,Timer,我试过调度计时器,但它似乎不能正常工作 我已经设置了滴答事件,每次滴答都会添加到滴答计数器中,但它只是做得不对。我也有一个秒表来计算它有多长时间了,但是数字不匹配。请让我知道什么样的解决方案可以让我每秒192次 Stopwatch sw = new Stopwatch(); public DispatcherTimer dt = new DispatcherTimer(); dt.Tick += dt_Tick; dt.Interval = TimeSpan.Fr

我试过调度计时器,但它似乎不能正常工作

我已经设置了滴答事件,每次滴答都会添加到滴答计数器中,但它只是做得不对。我也有一个秒表来计算它有多长时间了,但是数字不匹配。请让我知道什么样的解决方案可以让我每秒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.FromMiscells的间隔会得到截然不同的结果:

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


原因是什么?

您要求每5毫秒发生一次事件,而.NET计时器在此分辨率下根本不可靠

从文章中:

我从所有测试中得出的结论是,充其量,你可以指望计时器在目标时间的15毫秒内滴答作响。计时器很少在目标时间之前滴答作响,而且我从来没有看到它提前超过一毫秒。最坏的情况似乎是计时器将在目标时间的30毫秒内滴答作响。通过获取所需的目标频率(即每100毫秒一次),四舍五入到下一个15的倍数,然后再加上15来计算最坏的情况。因此,如果没有阻止正常处理的非常沉重的CPU负载,100毫秒计时器将每99到120毫秒滴答一次

使用这些计时器,你绝对不能获得比15毫秒更好的分辨率。如果你想让事情发生得更频繁,你必须找到一种不同的通知机制。没有.NET计时器对象将执行此操作


有很多方法可以解决这个问题,但它们通常涉及为高频定时应用程序设计的特定硬件和事件的驱动程序互操作。在使用激光源和CCD之前,我已经这样做了。

您要求每5毫秒发生一次事件,而.NET计时器在这种分辨率下根本不可靠

从文章中:

我从所有测试中得出的结论是,充其量,你可以指望计时器在目标时间的15毫秒内滴答作响。计时器很少在目标时间之前滴答作响,而且我从来没有看到它提前超过一毫秒。最坏的情况似乎是计时器将在目标时间的30毫秒内滴答作响。通过获取所需的目标频率(即每100毫秒一次),四舍五入到下一个15的倍数,然后再加上15来计算最坏的情况。因此,如果没有阻止正常处理的非常沉重的CPU负载,100毫秒计时器将每99到120毫秒滴答一次

使用这些计时器,你绝对不能获得比15毫秒更好的分辨率。如果你想让事情发生得更频繁,你必须找到一种不同的通知机制。没有.NET计时器对象将执行此操作


有很多方法可以解决这个问题,但它们通常涉及为高频定时应用程序设计的特定硬件和事件的驱动程序互操作。在使用激光源和CCD之前,我已经这样做了。

要求事件每秒触发192次,还是每1/192秒触发一次?如果是前者,那么您可以跟踪每1秒间隔的开始时间,并尽可能快地触发事件,直到触发192次。然后停止,直到下一个1秒间隔开始。1000不能被192整除。你能得到的最接近的速度(以及你目前正在做的事情)是每秒200次。(理论上)实现这一点的唯一方法是跳过滴答声或使用可变间隔。即使如此,计时器的分辨率也不准确。Windows不是实时操作系统。它是一个通用的业务应用程序操作系统。为工作使用正确的工具;如果您需要某件事情每秒发生192次,请为自己准备一个设计时考虑到这类任务的操作系统。2/16是0,2.0/16是0.125是要求事件每秒触发192次,还是要求事件每1/192秒触发一次?如果是前者,那么您可以跟踪每1秒间隔的开始时间,并尽可能快地触发事件,直到触发192次。然后停止,直到下一个1秒间隔开始。1000不能被192整除。你能得到的最接近的速度(以及你目前正在做的事情)是每秒200次。(理论上)实现这一点的唯一方法是跳过滴答声或使用可变间隔。即使如此,计时器的分辨率也不准确。Windows不是实时操作系统。它是一个通用的业务应用程序操作系统。为工作使用正确的工具;如果你需要某件事情每秒发生192次,那就为自己准备一个专门为这类任务设计的操作系统。2/16是0,2.0/16是0.125
    dt.Tick += dt_Tick;
    dt.Interval = TimeSpan.FromMilliseconds(2000 / 16);
    dt.Start();