2012-01-18 88 views
0

我正在使用DO interation來循環我用來測試互聯網連接的功能。代碼工作正常,除了當其中一個測試滿足時,循環停止。我希望這個程序在運行時在後臺繼續。我怎樣才能使這個工作?迭代不按照原樣工作

Private Sub checkInternet() 

    Dim InetChecker As Boolean 
    InetChecker = CheckForInternetConnection() 
    Do While LabelCount.Text <> "" 
     Thread.Sleep(10) 
     If InetChecker = True Then 
      Dim image = My.Resources.greenbar 
      PictureBox4.Image = image 

     Else 
      Thread.Sleep(10) 
      Dim image = My.Resources.redbar 
      PictureBox4.Image = image 
      'NoInetConnError.Show() 
     End If 
    Loop 
End Sub 

您的協助將不勝感激,謝謝。

回答

2

把一個BackgroundWorker表單上(你會發現它在工具箱中的組件部分)。

在Properties窗口中爲您的BackgroundWorker設置WorkerReportsProgressTrue

將下面的代碼到窗體

Private connected As Boolean 

Private Sub BackgroundWorker1_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) _ 
Handles BackgroundWorker1.DoWork 
    While True 
     Dim online = CheckForInternetConnection() 
     If online <> connected Then 
      connected = online 
      BackgroundWorker1.ReportProgress(CInt(online)) 
     End If 
     Thread.Sleep(500) 
    End While 
End Sub 

Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs) _ 
Handles BackgroundWorker1.ProgressChanged 
    Dim online As Boolean = CBool(e.ProgressPercentage) 
    If online Then 
     PictureBox4.Image = My.Resources.greenbar 
    Else 
     PictureBox4.Image = My.Resources.redbar 
    End If 
End Sub 

Private Sub Form_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
Handles MyBase.Load 
    ' Start the background worker 
    BackgroundWorker1.RunWorkerAsync() 
End Sub 

注意,在運行時Sub BackgroundWorker1_DoWork一個單獨的線程運行,並不會凍結您的形式。

+0

哇,這就像一個魅力。謝謝。 – 2012-01-20 02:48:07

1

最好在Timer中做這樣的事情,而不是循環。

Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As EventArgs) Handles Timer1.Tick 
    If CheckForInternetConnection Then 
    PictureBox4.Image = My.Resources.greenbar 
    Else 
    PictureBox4.Image = My.Resources.redbar 
    End If 
End Sub 
+0

感謝您的建議。但它的工作原理是,每次代碼運行時都會導致應用程序無響應。所以我會看看我是否可以使用下面的@davidsleeps建議的後臺工作方法。再次感謝。 – 2012-01-19 21:24:18

+0

@KismetAgbasi確保你沒有太頻繁地調用代碼。在你的發佈代碼中,你在檢查之間睡了10毫秒。這可能會頻繁地觸發您的CheckFor ...方法。因爲您只是試圖向最終用戶顯示狀態,所以10-30秒可能更實用。我從你的另一個問題看了你的CheckForInternetConnection代碼:如果你每10毫秒運行一次代碼,谷歌(或者任何網站)可能不會意識到你正在爲他們做什麼。 – LarsTech 2012-01-19 21:32:18

+0

謝謝,我沒有想到這一點。我會調整等待/睡眠時間。 – 2012-01-20 03:16:00

0

如果你有機會獲得Net框架3+,那麼你可以使用DispatcherTimer類基本上創建一個間隔(設置爲自己需要的任何長度),你可以辦理Tick事件。當引發滴答事件時,您可以進行互聯網連接檢查。

修改適合自己情況的MSDN例如,你可以做這樣的事情:

' DispatcherTimer setup 
dispatcherTimer = New Threading.DispatcherTimer() 
AddHandler dispatcherTimer.Tick, AddressOf dispatcherTimer_Tick 
dispatcherTimer.Interval = New TimeSpan(0,0,1) ' Or however long you want 
dispatcherTimer.Start() 

Private Sub dispatcherTimer_Tick(ByVal sender As Object, ByVal e As EventArgs) 
    ' Checks to see whether an internet connection is still available etc 
    checkInternet() 

    ' Forcing the CommandManager to raise the RequerySuggested event 
    CommandManager.InvalidateRequerySuggested() 
End Sub 
+0

感謝您的建議,不幸的是,工具箱中不提供dispatcherTimer控件。 – 2012-01-20 01:52:14