【問題】為什么 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}");
現象:
也就是,Timer 的 Interval 初始以及停止時,都設定為 1,為的是啟動的時候能馬上觸發一次,然后在第一次觸發時修改 Interval 為需要的間隔時間,用作后續的觸發間隔,然后問題就來了,修改間隔后的那次觸發,距離啟動時立馬觸發的那次,間隔時間達到了設定間隔時間的 3 倍,而且每次都是這樣,
修改時間間隔的地方加上先停止后啟動,問題依舊:

不使用異步方法,問題依舊:

懷疑是和執行緒池有關系,進而和 CPU 核心數有關,我這個是四核:

使用 毫秒定時器 [2] 或 多媒體定時器 [3] 也還是同樣的現象,
看到網上也有人遇到類似但不完全相同的問題(《System.Timers.Timer 非常不準確》[4]):

可以看到,他是使用了并行計算所以出問題了,但是我這里并沒有使用并行計算,
然后網上一個討論帖(《System.Timers.Timer 為什么會失效??》[5])是這樣說的:

因為懷疑計時不準,所以有好多人自己封裝呼叫 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/]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/503572.html
標籤:.NET技术
