`System.Windows.Forms.Timer` 或 `System.Timers.Timer` 本質上都是單一觸發源:一個 Timer 實例只能綁定一個 `Interval` 和一個 `Elapsed`/`Tick` 事件處理器。若嘗試讓多個用戶共用同一個 Timer 實例,會導致計時邏輯混亂、互相干擾。
採用一個全局 Timer + 數據結構記錄每個用戶的開始時間的模式:
// 伪代码示例
private readonly Dictionary<string, DateTime> _userLoginTime = new Dictionary<string, DateTime>();
private readonly System.Timers.Timer _globalTimer = new System.Timers.Timer(60_000); // 每分鐘檢查一次
public void UserLogin(string userId)
{
_userLoginTime[userId] = DateTime.Now;
if (!_globalTimer.Enabled) _globalTimer.Start();
}
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
var now = DateTime.Now;
var expiredUsers = _userLoginTime
.Where(kvp => (now - kvp.Value).TotalHours >= 2)
.Select(kvp => kvp.Key)
.ToList();
foreach (var userId in expiredUsers)
{
NotifyUserTimeUp(userId); // 發送提醒、自動交卷等
_userLoginTime.Remove(userId);
}
if (_userLoginTime.Count == 0) _globalTimer.Stop();
}
不要試圖讓一個 Timer 實例同時服務多個獨立計時任務。改用集中式輪詢 + 用戶狀態表,代碼更清晰、擴展性更強、避免競態條件。