各个定时器的差别这里就不说了,简单说下为啥要自定义定时器
最早我用的是 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});
}
}