2015-06-01 104 views
1

我使用DispatcherTimer调用在C#中的无效:毫秒间隔DispatcherTimer

 counter = new System.Windows.Threading.DispatcherTimer(); 
     counter.Tick += new EventHandler(counter_Tick); 
     counter.Interval = new TimeSpan(0, 0, 1); 
     counter.Start(); 

但是我想的时间间隔是几毫秒,时间跨度的参数是小时,分钟,秒,只接受整数(据我所知)。 DispatcherTimer有没有解决方法?我试过定时器,但我不能使用它(显然缺少参考)

在此先感谢。

+1

'TimeSpan'具有一个需要几毫秒的构造函数:[见MSDN](https://msdn.microsoft.com/en-us/library/6c7z43tw(v = vs.110).aspx)。基本上,使用'新的时间跨度(0,0,0,0,毫秒);' –

+0

@EBrown绝对张贴这是一个aswer我认为 – Pseudonym

回答

6

另一种方式

counter.Interval = TimeSpan.FromMilliseconds(1); 
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事件被触发重新启动。