DispatcherTimer 的毫秒间隔
Millisecond interval for DispatcherTimer
我正在使用 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 但我不能使用它(显然缺少参考)
提前致谢。
TimeSpan
对象有一个以毫秒为参数的构造函数:
MSDN 有详细信息:https://msdn.microsoft.com/en-us/library/6c7z43tw(v=vs.110).aspx
基本上,将 new TimeSpan(0, 0, 1)
替换为 new TimeSpan(0, 0, 0, 0, millisecondTimeout)
。
另一种方式
counter.Interval = TimeSpan.FromMilliseconds(1);
虽然@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 事件时重新启动。
我正在使用 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 但我不能使用它(显然缺少参考)
提前致谢。
TimeSpan
对象有一个以毫秒为参数的构造函数:
MSDN 有详细信息:https://msdn.microsoft.com/en-us/library/6c7z43tw(v=vs.110).aspx
基本上,将 new TimeSpan(0, 0, 1)
替换为 new TimeSpan(0, 0, 0, 0, millisecondTimeout)
。
另一种方式
counter.Interval = TimeSpan.FromMilliseconds(1);
虽然@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 事件时重新启动。