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

If...Then...ElseIf语句触发时回退至初始条件的问题排查

问题:定时器触发的条件判断异常导致设置值加载错误

我有一个名为My.Settings.StirProfile的设置文件,当特定秒数流逝后,会按索引将值加载到文本框中,用If...Then...ElseIf语句控制加载逻辑。

LblTime.Text由定时器更新,显示当前秒数,我写了以下代码:

If LblTime.Text <= My.Settings.StirProfile(1) Then
    stirrVal.Text = My.Settings.StirProfile(0)
    Label12.Text = My.Settings.StirProfile(1)' Val = 58 sec
    Label13.Text = My.Settings.StirProfile(0)' Val = 100 rpm
    'step2
ElseIf LblTime.Text = My.Settings.StirProfile(3) Then
    stirrVal.Text = My.Settings.StirProfile(2)
    Label12.Text = My.Settings.StirProfile(3)' val = 60 sec
    Label13.Text = My.Settings.StirProfile(2)' val= 110 rpm
    'step3
ElseIf LblTime.Text = My.Settings.StirProfile(5) Then
    stirrVal.Text = My.Settings.StirProfile(4)
    Label12.Text = My.Settings.StirProfile(5) ' val= 80 sec
    Label13.Text = My.Settings.StirProfile(4) ' val = 120 rpm
    'step4
ElseIf LblTime.Text = My.Settings.StirProfile(7) Then
    stirrVal.Text = My.Settings.StirProfile(6)
    Label12.Text = My.Settings.StirProfile(7)' val= 110 sec
    Label13.Text = My.Settings.StirProfile(6) ' val = 140 rpm
    'step5
ElseIf LblTime.Text = My.Settings.StirProfile(9) Then
    stirrVal.Text = My.Settings.StirProfile(8)
    Label12.Text = My.Settings.StirProfile(9)
    Label13.Text = My.Settings.StirProfile(8)
End If

异常现象

在第4步(对应My.Settings.StirProfile(7)的110秒),我期望显示110秒和140rpm,但程序却回退到第1步的索引0和1对应的数值(100rpm、58秒),尽管代码里明确指定了索引6和7。

但如果把这段赋值代码单独放在按钮点击事件里,却能得到正确的值:

Label12.Text = My.Settings.StirProfile(7)' val= 110 sec
Label13.Text = My.Settings.StirProfile(6) ' val = 140 rpm

核心原因:字符串与数值的比较逻辑错误

你现在的代码直接用字符串类型的LblTime.Text和My.Settings.StirProfile里的数值做比较,触发的是字符串字典序比较,而非数值大小比较:

  • 当LblTime.Text为"110"时,作为字符串和数值58(被隐式转为字符串"58")比较,字典序里"110" < "58"(第一个字符'1' < '5'),因此会命中第一个If条件,执行第1步的逻辑。
  • 按钮点击时是直接赋值,没有比较逻辑,所以能拿到正确值。

修复方案

  1. 统一类型后再比较:将LblTime.Text转换为整数,和StirProfile中的数值做数值比较:
' 先把当前时间转成整数,避免字符串比较问题
Dim currentSec As Integer = Integer.Parse(LblTime.Text)

If currentSec <= My.Settings.StirProfile(1) Then
    stirrVal.Text = My.Settings.StirProfile(0).ToString()
    Label12.Text = My.Settings.StirProfile(1).ToString() ' Val = 58 sec
    Label13.Text = My.Settings.StirProfile(0).ToString() ' Val = 100 rpm
    'step2
ElseIf currentSec = My.Settings.StirProfile(3) Then
    stirrVal.Text = My.Settings.StirProfile(2).ToString()
    Label12.Text = My.Settings.StirProfile(3).ToString() ' val = 60 sec
    Label13.Text = My.Settings.StirProfile(2).ToString() ' val= 110 rpm
    'step3
ElseIf currentSec = My.Settings.StirProfile(5) Then
    stirrVal.Text = My.Settings.StirProfile(4).ToString()
    Label12.Text = My.Settings.StirProfile(5).ToString() ' val= 80 sec
    Label13.Text = My.Settings.StirProfile(4).ToString() ' val = 120 rpm
    'step4
ElseIf currentSec = My.Settings.StirProfile(7) Then
    stirrVal.Text = My.Settings.StirProfile(6).ToString()
    Label12.Text = My.Settings.StirProfile(7).ToString() ' val= 110 sec
    Label13.Text = My.Settings.StirProfile(6).ToString() ' val = 140 rpm
    'step5
ElseIf currentSec = My.Settings.StirProfile(9) Then
    stirrVal.Text = My.Settings.StirProfile(8).ToString()
    Label12.Text = My.Settings.StirProfile(9).ToString()
    Label13.Text = My.Settings.StirProfile(8).ToString()
End If
  1. 额外优化建议:
    • 加入Integer.TryParse做异常处理,避免LblTime.Text无法转成整数的情况;
    • 用=匹配特定秒数可能因定时器精度问题错过触发,可改成区间判断(如currentSec > 上一步时间 AndAlso currentSec <= 当前步时间),逻辑更健壮。

内容的提问来源于stack exchange,提问作者Glen van Niekerk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:01:04