diff --git a/ActivityMonitor.cs b/ActivityMonitor.cs index 65b4791..d544b62 100644 --- a/ActivityMonitor.cs +++ b/ActivityMonitor.cs @@ -16,6 +16,7 @@ namespace TimerApp private DateTime _lastWorkStartTime; private TimeSpan _accumulatedWorkTime; private DateTime _restStartTime; + private int _restElapsedSeconds; // 休息已过秒数(用于避免时间计算导致的跳变) // 配置 (默认值) public TimeSpan WorkDuration { get; set; } = TimeSpan.FromMinutes(20); @@ -73,10 +74,12 @@ namespace TimerApp if (CurrentState == MonitorState.Resting) { // 休息模式逻辑 - TimeSpan timeInRest = DateTime.Now - _restStartTime; - TimeSpan remainingRest = RestDuration - timeInRest; + // 使用计数器而不是时间差,避免秒数跳变 + _restElapsedSeconds++; + int totalRestSeconds = (int)RestDuration.TotalSeconds; + int remainingSeconds = totalRestSeconds - _restElapsedSeconds; - if (remainingRest <= TimeSpan.Zero) + if (remainingSeconds <= 0) { // 休息结束 RestEnded?.Invoke(this, EventArgs.Empty); @@ -84,6 +87,7 @@ namespace TimerApp } else { + TimeSpan remainingRest = TimeSpan.FromSeconds(remainingSeconds); RestProgressChanged?.Invoke(this, remainingRest); } } @@ -130,6 +134,7 @@ namespace TimerApp { // 触发休息 _restStartTime = DateTime.Now; + _restElapsedSeconds = 0; // 重置休息计数器 ChangeState(MonitorState.Resting); RestStarted?.Invoke(this, EventArgs.Empty); } @@ -145,6 +150,7 @@ namespace TimerApp public void ForceRest() { _restStartTime = DateTime.Now; + _restElapsedSeconds = 0; // 重置休息计数器 ChangeState(MonitorState.Resting); RestStarted?.Invoke(this, EventArgs.Empty); } @@ -158,8 +164,11 @@ namespace TimerApp } else if (CurrentState == MonitorState.Resting) { - TimeSpan timeInRest = DateTime.Now - _restStartTime; - TimeSpan remaining = RestDuration - timeInRest; + // 使用计数器计算剩余时间,保持一致性 + int totalRestSeconds = (int)RestDuration.TotalSeconds; + int remainingSeconds = totalRestSeconds - _restElapsedSeconds; + if (remainingSeconds < 0) remainingSeconds = 0; + TimeSpan remaining = TimeSpan.FromSeconds(remainingSeconds); RestProgressChanged?.Invoke(this, remaining); } }