VB.NET Timer控件多条件分支执行冲突问题求排查与代码修正指导
问题根因
- 业务状态标记未互斥:点击新按钮时没有将其他操作的状态标记(
hardwareConnect/checkingPort/writeData等)全部重置为False,上一次操作的状态残留导致多个分支同时触发 - 删除操作无专属状态:REMOVE SAVED DATA逻辑没有绑定专属的状态标记,只要进度到89%就会执行,和当前点击的按钮无关
- 进度条未重置:每次启动Timer前没有将进度条宽度重置为0,上一次的进度残留会导致新逻辑的百分比判断直接跳步
- 字符串比较不可靠:直接判断百分比文本是否完全等于固定值,一旦计算出现精度偏差(比如得到49.99%或者50.01%),条件就会完全失效
修复方案
步骤1:新增删除操作的专属状态标记
在窗体类的全局声明部分新增变量:
Private removeData As Boolean = False
步骤2:修改所有按钮的点击事件
每次点击按钮时先重置所有状态、进度条和Timer参数,保证只有当前操作的状态为True,示例如下(其他按钮逻辑同理):
Private Sub btnConnect_Click(sender As Object, e As EventArgs) Handles btnConnect.Click ' 重置所有业务状态,避免残留 hardwareConnect = True checkingPort = False writeData = False removeData = False ' 重置进度条到初始状态 KryptonBorderEdge2.Width = 0 ' 重置Timer为默认间隔(替换为你代码中原来的初始间隔值即可) Timer1.Interval = 100 ' 启动Timer Timer1.Enabled = True End Sub
步骤3:优化Timer Tick事件逻辑
改用数值判断百分比,修正删除分支的绑定逻辑,完整代码如下:
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick ' 更新进度条 KryptonBorderEdge2.Width += 1 Dim curWidth As Integer = KryptonBorderEdge2.Width ' 直接计算百分比数值,避免字符串匹配的精度问题 Dim percentage As Double = (curWidth / 404.0) * 100.0 KryptonLabel5.Text = percentage.ToString("#0.00") & " %" If curWidth >= 404 Then Timer1.Enabled = False End If ' CONNECT按钮逻辑 If hardwareConnect Then If percentage >= 50 AndAlso percentage < 51 Then Timer1.Interval = 10 Label2.Text = "Hardware Found. Now attempting to connect." ElseIf percentage >= 100 Then KryptonComboBox1.Text = "OMNIKEY" Label2.Text = "Hardware successfully connected!" hardwareConnect = False Timer1.Enabled = False End If End If ' CHECK PORT按钮逻辑 If checkingPort Then If percentage >= 100 Then MsgBox("Card format: JCOP S3CC9P9" & vbNewLine & "Connected on COM4", vbOKOnly) KryptonComboBox2.Text = "JCOP S3CC9P9" Label2.Text = "..." checkingPort = False Timer1.Enabled = False End If End If ' REMOVE SAVED DATA按钮逻辑 If removeData Then If percentage >= 89 AndAlso percentage < 90 Then Label2.Text = "Finishing things up." ElseIf percentage >= 100 Then removeAll() MsgBox("Data Successfully Removed!", MsgBoxStyle.OkOnly) Label2.Text = "..." Timer1.Enabled = False removeData = False End If End If ' START/WRITE DATA按钮逻辑 If writeData Then Select Case True Case percentage >= 20 AndAlso percentage < 21 Label2.Text = "Blank Card detected." Case percentage >= 30 AndAlso percentage < 31 Label2.Text = "Writing account name..." Case percentage >= 40 AndAlso percentage < 41 Label2.Text = "Inserting ARQC Key and Master Key..." Case percentage >= 50 AndAlso percentage < 51 Label2.Text = "Confirming Expiry Date..." Case percentage >= 60 AndAlso percentage < 61 Label2.Text = "Generating PIN..." Case percentage >= 70 AndAlso percentage < 71 Label2.Text = "Writing PIN and CVV..." Case percentage >= 80 AndAlso percentage < 81 Label2.Text = "Confirming Track1/Track2/Track3..." Case percentage >= 90 AndAlso percentage < 91 Label2.Text = "Finalizing everything. Please wait for a while..." Timer1.Interval = 1000 Case percentage >= 100 Label2.Text = "Successfully writing data to the card!" Timer1.Enabled = False writeData = False End Select End If End Sub
内容的提问来源于stack exchange,提问作者Excel
相关产品推荐
相关产品推荐

