停止一次后,定时器不会重启

时间:2012-11-08 18:22:29

标签: vb.net timer

我通过COM端口发送数据并以4000间隔启动我的计时器,如果我在4秒之前没有收到任何信息,则发回我的信息。

{负载}

Private Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    [...]    
    SendCard(0)
    [...]
End Sub

{SendCard Sub} 我通过设置属性“LastCommand”通过该Sub发送需求信息,该属性通过端口发送数据。

Private Sub SendCard(ByVal cardIndex As Integer)
    If cardIndex < Setting.Machine.Cards.Length Then

        'Calling LastCommand's Set()
        LastCommand = "*" & Setting.Machine.Cards(cardIndex) & ": STRQ" & ControlChars.CrLf
    Else
        'Blah blah...
    End If

End Sub

该属性发送数据并启动Timer。

Public Property LastCommand() As String
    Get
        Return lastCommandString
    End Get
    Set(ByVal value As String)
        lastCommandString = value
        MainCOMSerialPort.Write(value)
        ResponseTimer.Start()
    End Set
End Property

当我收到回答时,我会停止计时器,然后询问下一张卡的信息。

Private Sub MainCOMSerialPort_DataReceived(...)
   [...]
   ResponseTimer.Stop() 'After this stop it does not trigger the Tick event any longer.
   SendCard(Array.IndexOf(Setting.Machine.Cards, CardString) + 1) 'Sending the next card
   [...]
End Sub

tick事件适用于第一张卡

Private Sub ResponseTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ResponseTimer.Tick
    'MessageBox.Show("No Respone Yet")
    LastCommand = LastCommand
End Sub

所以它每隔4秒就会询问我的第一个命令,直到得到回报,但是当我从第二个命令开始时,Timer不会打勾。

我正在使用.NET 4.0和{Windows.Forms.Timer},我尝试使用Timers.Timer并且无法工作,或者我不明白为什么它不会再次启动。

2 个答案:

答案 0 :(得分:0)

在属性'LastCommand'中,检查值不等于lastCommandString,如果没有启用ResponseTimer,也许它会有所帮助:

Public Property LastCommand() As String
    Get
        Return lastCommandString
    End Get
    Set(ByVal value As String)
        if value = lastCommandString then exit property
        lastCommandString = value
        MainCOMSerialPort.Write(value)
        if Not ResponseTimer.Enabled Then ResponseTimer.Start()
    End Set
End Property

答案 1 :(得分:0)

看起来System.Timers.Timer是我每次发送命令后每隔4秒设置一次elapse事件触发器的最佳选项。