我正在开发一个将数据发送到微控制器的小应用程序。无论如何,它的一部分包含每秒一次从Web服务器下载数据,并在数据发生变化时将数据转发给微控制器。要每秒重复一次这个程序,我正在打电话给一个计时器。要从互联网上获取数据,我正在使用一个线程。问题是,在一定(随机,但通常为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
我希望计时器不停地继续循环。知道如何制作它吗?请帮忙。感谢..
如果您需要更多详细信息,请告知我们。
答案 0 :(得分:0)
对于您要实现的目标,您希望丢弃计时器并使用while
循环。将计时器设置为每秒运行一次以运行具有未知执行时间的进程很可能会很快遇到问题。使用while
循环将简单地允许代码完成并在它准备就绪时循环,这意味着如果响应很慢,则代码可能小于一秒或超过一分钟。
答案 1 :(得分: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