You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不同方法中启停同一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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:56:55