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

C#项目中如何用Multimedia Timer实现1ms精度的30ms周期执行?

关于Windows高精度定时器的问题解答

1. Multimedia Timer是否能实现1ms精度?

可以。Multimedia Timer(基于timeSetEvent等Windows系统API)是原生提供的高精度定时器机制,理论最小精度可达1ms,远优于普通定时器受限于系统15ms时钟粒度的精度表现。实际运行中,精度可能受系统CPU负载、高优先级线程影响出现微小偏差,但对于30ms的周期性任务来说,完全能满足你的精度需求,且无需修改系统时钟设置。Windows Server 2019原生支持这套API,无需额外安装组件。

2. 适配Windows Server 2019的简单使用示例

下面是封装好的极简示例,你可以直接替换原有System.Timers.Timer逻辑,把你的Periodic_function()嵌入即可:

第一步:封装高精度定时器类

using System;
using System.Runtime.InteropServices;

public class HighPrecisionTimer
{
    // 底层API委托与函数声明
    private delegate void TimerCallback(uint uTimerID, uint uMsg, IntPtr dwUser, IntPtr dw1, IntPtr dw2);

    [DllImport("winmm.dll", SetLastError = true)]
    private static extern uint timeSetEvent(uint uDelay, uint uResolution, TimerCallback lpTimeProc, IntPtr dwUser, uint fuEvent);

    [DllImport("winmm.dll", SetLastError = true)]
    private static extern uint timeKillEvent(uint uTimerID);

    private uint _timerId;
    private readonly TimerCallback _internalCallback;

    // 构造函数传入你的周期性执行函数
    public HighPrecisionTimer(Action periodicAction)
    {
        _internalCallback = (_, __, ___, ____, _____) => periodicAction.Invoke();
    }

    // 启动定时器,参数为周期(毫秒)
    public void Start(int intervalMs)
    {
        // uResolution设为1ms,要求系统尽可能保证精度
        _timerId = timeSetEvent((uint)intervalMs, 1, _internalCallback, IntPtr.Zero, 0x0001); // 0x0001代表周期性触发
        if (_timerId == 0)
        {
            throw new System.ComponentModel.Win32Exception(Marshal.GetLastWin32Error());
        }
    }

    // 停止并释放定时器资源
    public void Stop()
    {
        if (_timerId != 0)
        {
            timeKillEvent(_timerId);
            _timerId = 0;
        }
    }
}

第二步:替换原有定时器逻辑

private HighPrecisionTimer _periodicTimer;

public void InitializeTimer_Periodic_timer()
{            
    // 传入你的Periodic_function作为定时执行逻辑
    _periodicTimer = new HighPrecisionTimer(Periodic_function);
    // 设置周期为30ms
    _periodicTimer.Start(30);
}

// 你的原有周期性函数,无需修改
private void Periodic_function()
{
    // 这里保留你的业务逻辑代码
}

// 注意:在程序退出、资源释放时调用Stop(),避免内存泄漏
// 例如在窗体关闭、服务停止事件中:
// _periodicTimer?.Stop();

使用说明

  • 这个封装类已经处理了底层API的调用细节,使用方式和你原来的System.Timers.Timer几乎一致。
  • Windows Server 2019自带winmm.dll,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 18:34:52