如何在不同方法中启停同一Stopwatch并获取耗时?解决作用域问题
解决跨方法访问Stopwatch的问题
这问题我做登录模块时也碰到过!你现在的核心问题很明确:你把Stopwatch声明成了OnSignIn方法的局部变量,方法执行完这个变量就被销毁了,OnSignOut自然拿不到它。解决思路特别简单——把Stopwatch提升为类的成员变量,让同一个类里的所有方法都能共享这个实例。
具体修改步骤:
- 把Stopwatch定义为类的成员字段:在类的内部、所有方法之外声明它,这样整个类的方法都能访问到它。
- 在
OnSignIn中启动计时:不再创建局部的Stopwatch,直接用成员变量启动,还要结合登录状态判断,避免重复启动。 - 在
OnSignOut中停止并获取耗时:同样先校验登录状态,停止计时后通过Elapsed属性拿到流逝的时间。
修改后的完整代码:
// 在类的成员区域声明Stopwatch,让整个类的方法都能访问 private Stopwatch _sessionStopwatch = new Stopwatch(); private bool _isSignedIn = false; // 把原SignIn改成更清晰的命名,方便理解 private int _pin; // 假设你的类里已有这个存储密码的字段 public void OnSignIn(int pin) { if (this._pin == pin && !_isSignedIn) { _sessionStopwatch.Reset(); // 重置计时,避免之前的记录干扰本次会话 _sessionStopwatch.Start(); _isSignedIn = true; // 标记为已登录状态 } else { MessageBox.Show("Incorrect pin or already logged in"); } } public void OnSignOut(int pin) { if (this._pin == pin && _isSignedIn) { _sessionStopwatch.Stop(); // 获取并处理流逝的时间,这里示例用弹窗展示 TimeSpan elapsed = _sessionStopwatch.Elapsed; MessageBox.Show($"本次会话时长:{elapsed.Hours}小时 {elapsed.Minutes}分钟 {elapsed.Seconds}秒"); _isSignedIn = false; // 标记为已登出状态 } else { MessageBox.Show("Error! Incorrect pin or not logged in"); } }
额外提醒:
- 重置计时很重要:每次登录前调用
Reset(),确保每次会话的计时都是从0开始,不会叠加之前的记录。 - 状态校验不能少:一定要结合
_isSignedIn状态控制Stopwatch的启停,防止用户重复登录、未登录就登出等异常操作导致的错误。 - Stopwatch的初始化:虽然Stopwatch是值类型(struct)有默认值,但声明时直接
new Stopwatch()能避免很多意外问题。
内容的提问来源于stack exchange,提问作者Daniel V.
相关产品推荐
相关产品推荐

