当前位置 : 主页 > 网络编程 > net编程 >

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?

来源:互联网 收集:自由互联 发布时间:2023-09-06
​ ​【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?​ ​ ​​独立观察员 2022 年 9 月 4 日​​ 在编写 “​​Wifi 固定器 [1] ​​” 程序时,按如

​【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?​

​​独立观察员 2022 年 9 月 4 日​​

在编写 “​​Wifi 固定器 [1]​​” 程序时,按如下方式使用了​​定时器​​:

//声明;
private Timer _Timer = new Timer() { Interval = 1, AutoReset = true };

//设置处理方法;
_Timer.Elapsed += new ElapsedEventHandler(TimerHandler);

/// <summary>
/// 定时器任务
/// </summary>
private async void TimerHandler(object source, ElapsedEventArgs e)
{
if (_Timer.Interval == 1) //如果是第一次执行
{
_Timer.Interval = 1000 * Configs.CheckInterval; //设置Interval为想要的间隔时间。
}

//刷新连接状态;
_profileRadio = GetProfileRadio(_fixedWifiPack);
if (_profileRadio.IsConnected)
{
Console.WriteLine("该 Wifi 已连接,无需操作");
return;
}

Console.WriteLine($"即将尝试连接【{_fixedWifiPack.Ssid}】...");
bool result = await NativeWifi.ConnectNetworkAsync(_fixedWifiPack.Interface.Id, _fixedWifiPack.ProfileName,
_fixedWifiPack.BssType, TimeSpan.FromSeconds(5));
Console.WriteLine($"连接结果:{(result ? "成功" : "失败")}");
}

//开启
if (_Timer.Enabled)
{
Console.WriteLine($"目前监控已处于开启状态,无需重复操作");
return;
}
_Timer.Start();
Console.WriteLine($"【开启监控成功】检测间隔时间为 {Configs.CheckInterval}s");

//关闭
if (!_Timer.Enabled)
{
Console.WriteLine($"目前监控已处于关闭状态,无需重复操作");
return;
}
_Timer.Stop();
_Timer.Interval = 1;
Console.WriteLine($"【关闭监控成功】{Environment.NewLine}");

 

现象:​​

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?_C#

​​

 

也就是,​​Timer​​ 的 Interval 初始以及停止时,都设置为 1,为的是启动的时候能马上触发一次。然后在第一次触发时修改 Interval 为需要的间隔时间,用作后续的触发间隔。然后问题就来了,修改间隔后的那次触发,距离启动时立马触发的那次,间隔时间达到了设定间隔时间的 3 倍,而且每次都是这样。

 

修改时间间隔的地方加上先停止后启动,问题依旧:​​

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?_C#_02

​​

 

不使用异步方法,问题依旧:​​

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?_C#_03

​​

 

怀疑是和线程池有关系,进而和 CPU 核心数有关,我这个是四核:​​

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?_C#_04

​​

 

使用 ​​毫秒定时器​​ [2] 或 ​​多媒体定时器​​ [3] 也还是同样的现象。

 

看到网上也有人遇到类似但不完全相同的问题(《​​System.Timers.Timer 非常不准确​​》[4]):​​

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?_C#_05

​​

 

可以看到,他是使用了并行计算所以出问题了,但是我这里并没有使用并行计算。

 

然后网上一个讨论帖(《​​System.Timers.Timer 为什么会失效??​​》[5])是这样说的:​​

【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?_C#_06

​​

 

因为怀疑计时不准,所以有好多人自己封装调用 ​​winmm.dll​​ 中的 “多媒体计时器” 来形成自定义的定时器,我尝试了两种(上面提到过),问题还是一样,所以可能他们这种不能解决我遇到的问题。

总之,问题还没解决,所以大家有什么想法或方法,还请不吝赐教。

 

附 - 参考资料及整理的资料:

1、Wifi 固定器 代码:​​https://gitee.com/dlgcy/DLGCY_FixedWifi/tree/Blog20220904​​

2、毫秒定时器(整理版代码):​​https://gitee.com/dlgcy/dotnetcodes/blob/dlgcy/DotNet.Utilities/%E5%AE%9A%E6%97%B6%E5%99%A8/MillisecondTimer.cs​​

3、​​多媒体定时器​​(原始代码托管):​​https://gitee.com/dlgcy/dotnetcodes/blob/dlgcy/DotNet.Utilities/%E5%AE%9A%E6%97%B6%E5%99%A8/MultimediaTimer.cs​​

4、《​​System.Timers.Timer 非常不准确​​》:​​https://qa.1r1g.com/sf/ask/2286140321/​​

5、《​​System.Timers.Timer 为什么会失效??​​》:​​https://bbs.csdn.net/topics/90487784?list=764574​​

6、《​​Timer 计时不准确的解决方案 每次都重新调整,修正误差​​》(提到多媒体定时器的文章):​​https://www.cnblogs.com/chucklu/p/4673600.html​​

7、《​​Timer 计时不准确的问题及解决方法​​》(提到毫秒定时器的文章):​​https://www.cnblogs.com/dehai/p/4347061.html​​

 

原创文章,转载请注明: 转载自 ​​独立观察员​​

本文链接地址: ​​【问题】为什么 System.Timers.Timer 更改间隔时间后的第一次触发时间是设定时间的三倍?[​​http://dlgcy.com/why-spent-three-more-time-to-start-timer-after-modify-interval/​]


【文章转自台湾大带宽服务器 http://www.558idc.com/tw.html提供,感恩】
网友评论