多线程上的vb.net ping

多线程上的vb.net ping,vb.net,multithreading,delegates,ping,Vb.net,Multithreading,Delegates,Ping,我家里大约有13台电脑,我想通过本地IP ping来监控它们。我设置了一个程序,将ping目标添加到字典中,该字典显示在列表视图中 现在,当我去平安IP时,使用: Dim MyPing As New System.Net.NetworkInformation.Ping Dim Myreply As System.Net.NetworkInformation.PingReply = MyPing.Send("192.168.1.10") MsgBox(Myreply.Rou

我家里大约有13台电脑,我想通过本地IP ping来监控它们。我设置了一个程序,将ping目标添加到字典中,该字典显示在列表视图中

现在,当我去平安IP时,使用:

    Dim MyPing As New System.Net.NetworkInformation.Ping
    Dim Myreply As System.Net.NetworkInformation.PingReply = MyPing.Send("192.168.1.10")
    MsgBox(Myreply.RoundtripTime)
它会延迟程序,直到收到IP的响应,或者直到超时。我知道我需要在单独的线程上ping每个IP以避免这种情况,并使用委托更新字典中的结果

我试图理解许多关于使用线程和委托的教程,但我不太明白它们是如何工作的,我需要一个非常简单的示例,它允许我将2个参数传递到这个新线程中,然后更新UI线程上的信息(在我的字典中)

然而,在尝试理解线程和委托之后,我在几个月前的一两个教程中拼凑了这个,最终放弃了。但它只允许您传递一个参数,我不确定当我在运行中创建线程以ping on时它是否有效。另外,我真的不明白它是如何工作的,我无法用我的一生来修改它

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim t1 As New Threading.Thread(AddressOf Count)
    t1.IsBackground = True
    t1.Start(100)
End Sub


Private Sub Count(ByVal Max As Integer)
    For i = 1 To Max
        SetLabelText(i.ToString())
        Threading.Thread.Sleep(50)
    Next
End Sub


Private Sub SetLabelText(ByVal text As String)
    If Label1.InvokeRequired Then
        Label1.Invoke(New Action(Of String)(AddressOf SetLabelText), text)
    Else
        Label1.Text = text

    End If
End Sub
我看了两件事:

总之,我需要在一个单独的线程上ping一个IP,然后用ping的结果更改字典中的一个值(即:超时,往返)。
因为我需要更新字典,所以我需要将两个参数传递到线程中,一个IP和用户为该计算机生成的唯一名称。谁能给我指出正确的方向,或者提供一个超级简单的例子,让我从中学习一些非常粗略的想法

Class pingObj
    Property addr As Net.IPAddress
    Property idx As Integer
End Class

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ListBox1.Items.Clear()
    'ips to ping
    Dim ips As New List(Of String)({"192.168.1.1", "192.168.1.5", "192.168.1.6"})
    For Each i As String In ips
        ListBox1.Items.Add(i)
        Dim foo As New pingObj
        foo.addr = Net.IPAddress.Parse(i)
        foo.idx = ListBox1.Items.Count - 1
        Dim t As New Threading.Thread(AddressOf pingem)
        t.IsBackground = True
        t.Start(foo)
    Next
End Sub

Private Sub pingem(p As Object)
    Dim pobj As pingObj = DirectCast(p, pingObj)
    Dim MyPing As New System.Net.NetworkInformation.Ping
    Do
        Dim Myreply As System.Net.NetworkInformation.PingReply = MyPing.Send(pobj.addr)
        Me.Invoke(Sub() ListBox1.Items.Item(pobj.idx) = String.Format("{0} - {1}", _
                                                                     Myreply.Address.ToString, Myreply.RoundtripTime.ToString))
        Threading.Thread.Sleep(1000)
    Loop

End Sub

这是有道理的,但是你能解释一下最后一个子节点吗?我不太明白它是如何工作的。是线程执行实际的ping操作。放入一些ip并在睡眠中添加断点。看看这些变量,它应该更有意义。很抱歉响应延迟,但你是对的。我剖析了它,并将它合并到我的项目中,我现在理解了它,它工作得很好。谢谢你,我会尽可能选择最好的答案。不过我有一个奇怪的问题。我已经对上面的代码做了相当多的修改,但已经足够相似了。假设我从线程中删除了一些内容,它会给我一个错误,我不确定如何“停止”线程(我知道你不应该这样做)。如果我要从列表视图中删除一些内容,我会怎么做?也许你应该用你的代码开始一个新的问题,然后问你的问题。