.Net 自定义定时器

各个定时器的差别这里就不说了,简单说下为啥要自定义定时器
最早我用的是 System.Timer.Timer, 但有一天突然程序报错,排查了一下发现定时器突然停止了1S,然后又开始运行了,但这1S就导致我程序报错.
然后我又试了下 System.Thread.Timer, 但还是会出现这种情况, 我排查了下程序发现没问题, 就开始考虑是不是优先级的问题,
发现上面两种都不能设置优先级, 我就试着开个线程自己做个定时器, 结果发现效果要比想象中的好.
上面两种定时器其实触发时间并不标准,线程比较忙碌时误差会很大, 只有间隔平均下来才是你设置的间隔
使用自定义的这个, 我测试时每个间隔都很标准
public class MyTimer { public MyTimer(TimerCallback callback, object? state, int dueTime, int period) { Callback = callback; DueTime = dueTime; Period = period; } public TimerCallback Callback { get; set; } /// <summary> /// 开始循环计时 /// </summary> public int DueTime { get; set; } /// <summary> /// 循环周期 /// </summary> public int Period { get; set; } public CancellationTokenSource cst { get; set; } public void Start() { Task.Run(() => { // 设置线程优先级 Thread.CurrentThread.Priority = ThreadPriority.Highest; cst = new CancellationTokenSource(); while (!cst.IsCancellationRequested) { Callback(null); Thread.Sleep(Period); } }); } public void Stop() { if(cst != null)cst.Cancel(); } }
MyTimer timer = new MyTimer(Handler,null,-1,250);
// 定时器启动
timer.Start();
// 定时器停止
timer.Stop();


public void Handler(object sender)
{
    byte[] byteData;
    lock (Definition.P_Lock)
    {
        Definition.P_Transmit("182756f4", byteData);//new byte[] { 0x69,0x19,0xC4,0x09,0x01,0x3C,0x64,0x50});
    }
}

 

posted @ 2025-10-20 14:39  妖言惑众'  阅读(12)  评论(0)    收藏  举报