refactor: 项目稳定性优化
This commit is contained in:
@@ -10,17 +10,13 @@ namespace TimerApp
|
||||
Resting
|
||||
}
|
||||
|
||||
public class ActivityMonitor
|
||||
public sealed class ActivityMonitor : IDisposable
|
||||
{
|
||||
private System.Windows.Forms.Timer _timer;
|
||||
private DateTime _lastWorkStartTime;
|
||||
private readonly System.Windows.Forms.Timer _timer;
|
||||
private TimeSpan _accumulatedWorkTime;
|
||||
private DateTime _restStartTime;
|
||||
private int _restElapsedSeconds; // 休息已过秒数(用于避免时间计算导致的跳变)
|
||||
private bool _isPaused = false; // 暂停状态
|
||||
private DateTime _pauseStartTime; // 暂停开始时间
|
||||
private TimeSpan _pauseDuration = TimeSpan.Zero; // 累计暂停时间(用于工作计时)
|
||||
private int _restPauseStartSeconds = 0; // 休息暂停时的已过秒数
|
||||
private int _restElapsedSeconds;
|
||||
private bool _isPaused;
|
||||
private bool _disposed;
|
||||
|
||||
// 配置 (默认值)
|
||||
public TimeSpan WorkDuration { get; set; } = TimeSpan.FromMinutes(20);
|
||||
@@ -31,11 +27,11 @@ namespace TimerApp
|
||||
public bool IsPaused { get; private set; } = false;
|
||||
|
||||
// 事件
|
||||
public event EventHandler<TimeSpan> WorkProgressChanged; // 剩余工作时间
|
||||
public event EventHandler<TimeSpan> RestProgressChanged; // 剩余休息时间
|
||||
public event EventHandler RestStarted;
|
||||
public event EventHandler RestEnded;
|
||||
public event EventHandler StateChanged;
|
||||
public event EventHandler<TimeSpan>? WorkProgressChanged; // 剩余工作时间
|
||||
public event EventHandler<TimeSpan>? RestProgressChanged; // 剩余休息时间
|
||||
public event EventHandler? RestStarted;
|
||||
public event EventHandler? RestEnded;
|
||||
public event EventHandler? StateChanged;
|
||||
|
||||
public ActivityMonitor()
|
||||
{
|
||||
@@ -58,7 +54,6 @@ namespace TimerApp
|
||||
private void ResetWork()
|
||||
{
|
||||
_accumulatedWorkTime = TimeSpan.Zero;
|
||||
_lastWorkStartTime = DateTime.Now;
|
||||
ChangeState(MonitorState.Idle);
|
||||
}
|
||||
|
||||
@@ -71,7 +66,7 @@ namespace TimerApp
|
||||
}
|
||||
}
|
||||
|
||||
private void Timer_Tick(object sender, EventArgs e)
|
||||
private void Timer_Tick(object? sender, EventArgs e)
|
||||
{
|
||||
// 如果处于暂停状态,不处理计时逻辑
|
||||
if (_isPaused)
|
||||
@@ -142,7 +137,6 @@ namespace TimerApp
|
||||
{
|
||||
// 从空闲变为工作
|
||||
ChangeState(MonitorState.Working);
|
||||
_lastWorkStartTime = DateTime.Now;
|
||||
}
|
||||
|
||||
// 累加工作时间
|
||||
@@ -155,7 +149,6 @@ namespace TimerApp
|
||||
if (remainingWork <= TimeSpan.Zero)
|
||||
{
|
||||
// 触发休息
|
||||
_restStartTime = DateTime.Now;
|
||||
_restElapsedSeconds = 0; // 重置休息计数器
|
||||
ChangeState(MonitorState.Resting);
|
||||
RestStarted?.Invoke(this, EventArgs.Empty);
|
||||
@@ -171,7 +164,6 @@ namespace TimerApp
|
||||
// 用于强制重置或测试
|
||||
public void ForceRest()
|
||||
{
|
||||
_restStartTime = DateTime.Now;
|
||||
_restElapsedSeconds = 0; // 重置休息计数器
|
||||
ChangeState(MonitorState.Resting);
|
||||
RestStarted?.Invoke(this, EventArgs.Empty);
|
||||
@@ -198,10 +190,8 @@ namespace TimerApp
|
||||
public void Restart()
|
||||
{
|
||||
_accumulatedWorkTime = TimeSpan.Zero;
|
||||
_lastWorkStartTime = DateTime.Now;
|
||||
_isPaused = false;
|
||||
IsPaused = false;
|
||||
_pauseDuration = TimeSpan.Zero;
|
||||
|
||||
// Ensure timer is running
|
||||
if (!_timer.Enabled) _timer.Start();
|
||||
@@ -219,13 +209,6 @@ namespace TimerApp
|
||||
{
|
||||
_isPaused = true;
|
||||
IsPaused = true;
|
||||
_pauseStartTime = DateTime.Now;
|
||||
|
||||
// 如果正在休息,记录当前已过秒数
|
||||
if (CurrentState == MonitorState.Resting)
|
||||
{
|
||||
_restPauseStartSeconds = _restElapsedSeconds;
|
||||
}
|
||||
|
||||
StateChanged?.Invoke(this, EventArgs.Empty);
|
||||
}
|
||||
@@ -238,25 +221,19 @@ namespace TimerApp
|
||||
_isPaused = false;
|
||||
IsPaused = false;
|
||||
|
||||
// 计算暂停时长
|
||||
TimeSpan pauseTime = DateTime.Now - _pauseStartTime;
|
||||
|
||||
// 如果正在工作,将暂停时间累加到暂停总时长中
|
||||
// 这样工作时间就不会因为暂停而减少
|
||||
if (CurrentState == MonitorState.Working)
|
||||
{
|
||||
_pauseDuration += pauseTime;
|
||||
}
|
||||
// 如果正在休息,调整已过秒数,使剩余时间保持不变
|
||||
else if (CurrentState == MonitorState.Resting)
|
||||
{
|
||||
// 保持已过秒数不变,这样恢复后剩余时间不会变化
|
||||
// _restElapsedSeconds 保持不变
|
||||
}
|
||||
|
||||
StateChanged?.Invoke(this, EventArgs.Empty);
|
||||
RefreshStatus();
|
||||
}
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
if (_disposed) return;
|
||||
_disposed = true;
|
||||
|
||||
_timer.Stop();
|
||||
_timer.Tick -= Timer_Tick;
|
||||
_timer.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user