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

如何仅通过代码构建从0开始毫秒级递增的计数器变量

问题修复方案

你现有代码无法运行的核心问题如下:

  • Timer被声明为Counter()函数内的局部变量,函数执行完成后实例会被垃圾回收,无法持续运行
  • 事件绑定代码被注释,且绑定的方法名与你实际定义的事件处理方法名不匹配
  • 返回值逻辑完全错误:Integer.Parse(timer.ToString())是尝试将Timer对象的类型名称字符串解析为整数,必然抛出异常
  • 参数设置不符合需求:你当前设置的Interval=1000是1秒触发1次,不符合毫秒计数要求,且直接取事件参数的时间字段无法得到连续递增的毫秒计数值
可直接运行的实现代码
Imports System.Timers

Public Class Counter
    ' 类级别持有Timer实例,避免被GC回收导致运行中断
    Private ReadOnly _timer As Timer
    ' 毫秒计数属性,用Long类型避免整数溢出
    Public Property Count As Long
    ' 记录计数器启动时间,用于校准计数精度
    Private _startTime As DateTime

    Private Sub Counter_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Count = 0
        ' 初始化Timer,触发间隔设为1ms
        _timer = New Timer(1)
        _timer.AutoReset = True
        ' 正确绑定Elapsed事件,方法名与定义的处理方法一致
        AddHandler _timer.Elapsed, AddressOf CountEvent
        ' 记录启动时间戳
        _startTime = DateTime.Now
        ' 启动计时器
        _timer.Start()
    End Sub

    Private Sub CountEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
        ' 通过时间差计算真实经过的毫秒数,避免Timer触发间隔偏差导致计数不准
        Count = CLng((DateTime.Now - _startTime).TotalMilliseconds)
        ' 测试输出
        Console.WriteLine($"当前毫秒计数值:{Count}")
    End Sub
End Class
关键说明
  • 不要在方法内部声明Timer实例:必须将Timer定义为类的全局字段,才能保证实例在类的生命周期内持续存在,不会被垃圾回收
  • 事件绑定规则:AddHandler后接的事件名、AddressOf后接的方法签名必须匹配,Elapsed事件对应的处理方法必须符合ElapsedEventHandler委托的签名要求(参数为Object类型的事件源、ElapsedEventArgs类型的事件参数)
  • 精度问题:Windows系统默认的线程调度精度约为10~16ms,即使将Interval设为1ms,Timer也无法做到严格每1毫秒触发一次,因此不要用「每次触发累加1」的方式计数,通过时间差计算的方式可以保证计数和真实流逝时间一致
  • 该实现完全通过手写代码完成,没有使用工具箱提供的可视化Timer控件,符合要求。

内容的提问来源于stack exchange,提问作者Flying Nimbus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 08:01:11