如何准确测量两次按钮点击时间间隔,解决Stopwatch返回0的问题
问题原因
你代码的核心问题是每次触发点击事件都会重新实例化全新的Stopwatch局部对象:
- 第一次点击时创建的
Stopwatch在方法执行结束后就被回收,没有被留存 - 第二次点击时创建的是完全独立的新
Stopwatch,从实例化到调用Stop间隔不到1毫秒,自然输出全0
修复方案
把Stopwatch调整为类级别的成员变量,和你之前定义的clicked布尔值放在同一层级即可,完整代码如下:
bool clicked = true; // 全局共用同一个Stopwatch实例 Stopwatch stopwatch = new Stopwatch(); private void button1_Click(object sender, EventArgs e) { if (clicked) { // Restart方法会自动清空上次计时结果再启动,比单独Start更稳妥 stopwatch.Restart(); clicked = false; } else { stopwatch.Stop(); // 直接输出毫秒数更符合你的需求,不需要默认的时分秒格式可以保留这行 label1.Text = $"{stopwatch.Elapsed.TotalMilliseconds} ms"; // 需要时分秒格式就替换为下面这行 // label1.Text = stopwatch.Elapsed.ToString(); clicked = true; } }
额外优化建议
如果你还需要保留实时刷新时间的需求,可以搭配原来的Timer组件使用:Timer只负责定时读取Stopwatch.Elapsed的值更新界面,计时逻辑完全交给精度更高的Stopwatch,哪怕把Timer的Interval设为100ms也不会影响最终计时精度,示例代码如下:
private void timer1_Tick(object sender, EventArgs e) { // 仅在计时状态下刷新界面 if (!clicked) { label1.Text = $"{stopwatch.Elapsed.TotalMilliseconds:F0} ms"; } }
内容的提问来源于stack exchange,提问作者Evilbitmap
相关产品推荐
相关产品推荐

