DispatcherTimer的毫秒间隔

4
我将使用 DispatcherTimer 来调用 C# 中的一个 void 函数:
        counter = new System.Windows.Threading.DispatcherTimer();
        counter.Tick += new EventHandler(counter_Tick);
        counter.Interval = new TimeSpan(0, 0, 1);
        counter.Start();

然而,我希望间隔时间只有几毫秒,TimeSpan的参数是小时、分钟和秒,并且只接受整数(据我所知)。是否有办法绕过DispatcherTimer?我尝试过Timer但无法使用它(显然缺少引用)。
提前感谢。

1
TimeSpan有一个以毫秒为参数的构造函数:请参见MSDN。基本上,使用new TimeSpan(0, 0, 0, 0, milliseconds);即可。 - Der Kommissar
@EBrown 绝对将此作为答案发布,我认为 - Pseudonym
3个回答

9

另一种方式

  counter.Interval = TimeSpan.FromMilliseconds(1);

7

2
尽管 @EBrown 的答案已经告诉你如何在 DispatcherTimer 中使用毫秒,但其精度据说在15-20毫秒左右,并且每次迭代误差会累积,这使得它有些不实用。
然而,可以通过在与 DispatcherTimer 同时启动一个 System.Diagnostics.StopWatch 并在 Tick 事件中使用较小的时间步长检查 StopWatch.ElapsedMilliseconds 来解决此问题,似乎能够提供更精确的结果。它也适用于 System.Timers.Timer。
以下是我制作的基于 WPF 程序的简短示例。
private void StartTimers(object sender, RoutedEventArgs e)
{
    dtimer = new DispatcherTimer();
    dtimer.Tick += new EventHandler(dTimer_Tick);
    dtimer.Interval = TimeSpan.FromMilliseconds(1);  // the small time step

    stopWatch = new StopWatch();

    dTimer.Start();
    stopWatch.Start();
}

private void dTimer_Tick(object sender, EventArgs e)
{        
     currentTime = stopWatch.ElapsedMilliseconds;
        if (currentTime - oldTime > interval)
        {
            oldTime = currentTime;
            DoStuff();
        }
}   

在 Tick 事件中使用 StopWatch.Restart 进行迭代会有与 DispatchTimer 相同的错误问题,因为它将在 DispatchTimer 事件被触发时重新启动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接