-1

我正在开发一个将数据发送到微控制器的小应用程序。无论如何,它的一部分包含每秒一次从网络服务器下载数据,如果数据发生变化,则将该数据转发到微控制器。为了每秒重复一次该过程,我调用了一个计时器。为了从互联网上获取数据,我使用了一个线程。问题是,计时器在一定(随机,但通常为 1-3)次执行后停止定期重复。可能是,它等待线程从互联网上获取数据,但我不确定,因为它永远卡在那里。代码如下。

定时器代码

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick

    thread = New System.Threading.Thread(AddressOf dlstatus)
    thread.Start()

 If ((s1sub1 <> s2sub1)) Then

            'Func1

        ElseIf (s2sub2 = "n") Then

            'Func2
Endif


End sub

使用线程调用的 dlstatus 函数

Private Sub dlstatus()
        str2 = enc.GetString(wc.DownloadData(link2))
End sub

我希望计时器继续循环而不停止。知道如何做到这一点吗?请帮忙。谢谢..

PS如果您需要更多详细信息,请告诉我...

4

2 回答 2

0

对于您要实现的目标,您想丢弃计时器并使用while循环。将计时器设置为每秒运行一次以运行执行时间未知的进程可能很快就会遇到问题。使用while循环只会让代码在准备好时完成并循环,这意味着如果响应那么慢,它可能会不到一秒或超过一分钟。

于 2013-05-12T22:10:23.910 回答
0

当我创建 Timer.Tick 事件时,我通常会停止并重新启动 Timer 作为该函数中的第一个和最后一个调用。

否则,如果您的代码运行时间超过一秒钟,则可能会因您上次调用的治疗而绊倒。

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    Timer1.Stop ' pause the timer until this call has finished

    thread = New System.Threading.Thread(AddressOf dlstatus)
    thread.Start()

    If ((s1sub1 <> s2sub1)) Then
         'Func1
    ElseIf (s2sub2 = "n") Then
         'Func2
    Endif

    Timer1.Start ' we've finished the call, restart the timer  
End sub

但是,您可能还会发现后台工作线程是更好的选择: http:
//msdn.microsoft.com/en-us/library/cc221403 (v=vs.95).aspx

于 2013-05-12T22:10:48.303 回答