Timer 使用方式
011
From: 011netservice@gmail.com
Date: 2022-04-24

Timer

Timer是程式開發時, 常用的基本元件.
.Net Framework提供4種不同的timer元件如下.
Name Multithread 適用 使用方式 Description
System.Timers.Timer Y Server或Service. event message
  1. 循環時間固定. 不受Job thread影響. 只要時間一到就會呼叫ElapsedEventHandler一次.
  2. 可指定首次執行前的等待時間.
System.Threading.Timer Y Server或Service. callback method
  1. 循環時間固定. 不受Job thread影響. 只要時間一到就會呼叫callback method一次.
  2. 可指定首次執行前的等待時間.
System.Windows.Forms.Timer N Windows Form by toolbox/by code
  1. 跟form同一個執行緒.
  2. 循環時間為(Timer interval + job執行時間). 若Job執行時間超過Timer Interval時間, 則循環執行時間不固定.
System.Web.UI.Timer   ASP.NET web page postbacks 可定時以非同步方式更新網頁之UpdatePanel至client端.
程式參考: Timer使用方式

常見問題

若需要準時於(每分鐘0秒)時, 或(每小時0分0秒)時執行, 應如何控制?
例如:
若於01:01:01時啟動timer, 需要控制於01:02:00首次執行, 並且之後每分鐘0秒時循環執行, 應如何控制:
Ans:
參考如下計算程式, 設定於timer的首次執行/每次執行等待時間:
// 每分鐘0秒準時執行.
DateTime t1 = DateTime.Now;
DateTime t2 = t1.AddMinutes(1);
DateTime t3 = new DateTime(t2.Year, t2.Month, t2.Day, t2.Hour, t2.Minute, 0, 0);
double dDueTimeMs = (t3 - t1).TotalMilliseconds;  // 首次執行需要等待的ms.
double dPeriodMs = (t2 - t1).TotalMilliseconds;   // 每分鐘之ms, 這是固定值, 可訂為常數, 不需要每次計算.

// 每小時0分0秒準時執行.
DateTime th1 = DateTime.Now;
DateTime th2 = th1.AddHours(1);
DateTime th3 = new DateTime(th2.Year, th2.Month, th2.Day, th2.Hour, 0, 0, 0);
double dhDueTimeMs = (th3 - th1).TotalMilliseconds;  // 首次執行需要等待的ms.
double dhPeriodMs = (th2 - th1).TotalMilliseconds;   // 每小時之ms, 這是固定值, 可訂為常數, 不需要每次計算.


Log:
Date Author Description
2017-02-13, Honda, copy from luckstat document.
2017-03-15, Honda, 增加循環時間與Interval 說明.
011