VB 2010 — Я получаю результаты в конце цикла, а не во время него

#vb.net #loops

#vb.net #циклы

Вопрос:

Я использую VB 2010 Express. У меня есть цикл, который вызывает функцию с именем «singlePing», которая выполняет пинг IP-адреса. Если приложению удалось достичь этого IP, оно возвращает определенный цвет метки в зеленый, в противном случае — красный. (Для каждого IP-адреса есть метка)

Когда я запускаю свое приложение, кажется, что мое приложение «застряло» (на самом деле оно запускает этот цикл), и через некоторое время оно обновляет задний цвет ВСЕХ ЯРЛЫКОВ сразу.

Почему он не обновляет каждую метку одновременно? Это заставляет «пользователя» думать, что приложение застряло. Вот мой код:

         Private Sub btnActivateMonitor_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnActivateMonitor.Click
        Dim xmldoc As New XmlDataDocument()
    Dim xmlnode As XmlNodeList
    Dim fs As New FileStream(acXmlFileName, FileMode.Open, FileAccess.Read)
    Dim i As Integer

    Dim name As String
    Dim lbl As String
    Dim ip As String

    xmldoc.Load(fs)
    xmlnode = xmldoc.GetElementsByTagName("Unit")
    For i = 0 To xmlnode.Count - 1
        name = xmlnode(i).ChildNodes.Item(0).InnerText.Trim()
        lbl = xmlnode(i).ChildNodes.Item(1).InnerText.Trim()
        ip = xmlnode(i).ChildNodes.Item(2).InnerText.Trim()

        checkUnitStatus(name, lbl, ip)
    Next
    End Sub
 Sub checkUnitStatus(ByVal name As String, ByVal lbl As String, ByVal ip As String)
     rtbLog.Text = rtbLog.Text amp; TimeValue(Now) amp; " Checking ..." amp; name amp; "(" amp; ip amp; ") ..........."

    If sendPing(ip) Then
        Me.Controls(lbl).BackColor = Color.Green
        rtbLog.Text = rtbLog.Text amp; "success" amp; vbCrLf
    Else
        Me.Controls(lbl).BackColor = Color.Red
        rtbLog.Text = rtbLog.Text amp; "Failed" amp; vbCrLf
    End If
End Sub
' --------------------------------------
'|  Send Ping (ip)
' -------------------------------------- 
Function sendPing(ByVal ip As String)
    Dim reachable As Boolean = False
    Try
        reachable = My.Computer.Network.IsAvailable AndAlso _
                    My.Computer.Network.Ping(ip, 10000)
    Catch pingException As System.Net.NetworkInformation.PingException
    Catch genericNetworkException As System.Net.NetworkInformation.NetworkInformationException
        ' Fail silently and return false
    End Try
    Return reachable
End Function
  

Ответ №1:

вы должны обновить пользовательский интерфейс внутри цикла. т.е. после вызова checkUnitStatus

    checkUnitStatus(name, lbl, ip) 
   Me.Controls(lbl).Refresh()
Next