2013-05-12 25 views
-1

我正在開發一個將數據發送到微控制器的小應用程序。無論如何,它的一部分包含一秒鐘內從網絡服務器下載數據,並在數據發生變化時將數據轉發給微控制器。每秒重複一次該程序,我打電話給一個計時器。要從互聯網獲取數據,我正在使用一個線程。問題是,計時器在一定的(隨機的,但通常是1-3)執行次數之後,會定期停止重複。可能是,它等待線程從互聯網上獲取數據,但我不確定它會一直保持在那裏。代碼如下。這是使用一個線程VB.NET - 計時器無法正常使用線程

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

稱爲

定時器代碼

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功能我希望計時器繼續不停止循環。任何想法如何使它如此?請幫忙。謝謝..

P.S請讓我知道如果你需要任何更多的細節......

+0

當然,你可以只使用一個'雖然...... End'聲明?請原諒我,如果我簡單地過分簡化了.. – adaam 2013-05-12 22:06:07

+0

把** While ... End'循環放在** BackgroundWorker()** DoWork()處理程序中並在底部使它Sleep()一秒鐘,以便它再次刷新最後一次更新完成後一秒鐘。只需使用BackgroundWorker()提供的一個線程;不再需要任何東西。 – 2013-05-12 22:41:06

+0

感謝你們所有人的回覆。 BackgroundWorker爲我做的工作很好。 – kidcoder 2013-05-14 16:43:32

回答

0

對於你想實現什麼,要放棄定時器和使用while循環。將計時器設置爲每秒運行以運行具有未知執行時間的進程可能會非常迅速地遇到問題。使用while循環將簡單地允許代碼在準備好時完成並循環,這意味着如果響應速度很慢,則代碼可能少於一秒或超過一分鐘。

0

當我創建Timer.Tick事件時,我通常停止並重新啓動計時器作爲該函數中的第一次和最後一次調用。

否則,如果您的代碼需要更長的時間才能運行,則可能會絆倒上次調用的治療。

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