You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wpf设置5ms间隔定时器,fff毫秒差值为何不为5?

问题分析:WPF中5ms间隔定时器的毫秒差值不符预期

核心原因:系统时钟精度与定时器机制限制

  • DateTime.Now的精度瓶颈
    Windows系统默认的系统时钟精度并非1ms级,通常在10-15ms区间(具体取决于系统版本和硬件配置)。DateTime.Now的返回值依赖这个系统时钟,它不会实时更新到每1ms,而是每隔固定的时钟周期才跳变一次。因此即便每5ms调用一次DateTime.Now,前后两次的毫秒值要么完全相同,要么跳变10/15ms,不会出现5ms的差值。

  • DispatcherTimer的调度特性
    DispatcherTimer依赖WPF的UI线程调度队列,设置的Interval仅代表最小触发间隔,而非精确间隔。如果UI线程正在处理其他任务(比如界面渲染、事件响应),Tick事件会被延迟触发;加上Dispatcher默认的调度优先级限制,实际触发间隔会远大于设置的5ms。

  • Task.Delay的精度局限
    更新后的Task.Delay(interval)同样受系统时钟精度限制,且await操作会将任务放回线程池调度,调度延迟进一步导致实际间隔偏离预期,无法保证5ms的精确触发。

差值的实际计算逻辑

显示的毫秒差值,是两次调用DateTime.Now时系统时钟当前毫秒值的直接差值。由于系统时钟是周期性跳变的,差值只会是系统时钟精度的整数倍(如10ms、15ms),或者为0(两次取时间时时钟未发生跳变)。

举个实际场景:假设系统时钟每10ms更新一次,第一次取时间为100ms,5ms后第二次取时间,时钟未更新仍为100ms,差值为0;再过5ms第三次取时间,时钟跳至110ms,差值即为10ms。

高精度时间采样的实现方案

若需要精确测量时间间隔,放弃DateTime.Now,改用Stopwatch类:

  • Stopwatch依赖硬件高精度计时器(硬件支持的前提下),精度可达1ms以内;
  • 通过记录Stopwatch.ElapsedMilliseconds,能准确反映实际的时间流逝。

DispatcherTimer版本修改示例

private Stopwatch _stopwatch = Stopwatch.StartNew();
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    long currentElapsedMs = _stopwatch.ElapsedMilliseconds;
    listBox1.Items.Add($"{DateTime.Now:HH:mm:ss:fff} | 已运行:{currentElapsedMs}ms");
    // 原有界面逻辑...
}

Task版本修改示例

private Stopwatch _stopwatch = Stopwatch.StartNew();
private void sendRequest()
{
    k++;
    datas.Add(_stopwatch.ElapsedMilliseconds);
}

内容的提问来源于stack exchange,提问作者wpf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:40:08