如何仅通过代码构建从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
相关产品推荐
相关产品推荐

