我家里大约有 13 台计算机,我希望能够通过它们的本地 IP ping 它们来监控它们。我设置了一个程序来将 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 时它是否会起作用。另外,我真的不明白它是如何工作的,也无法终生修改它。
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
我看过的几件事:
http://www.developerfusion.com/article/5251/delegates-in-vbnet/
http://www.tek-tips.com/faqs.cfm?fid=6036
http://timhastings.co.uk/2011/09/vb-net-using-delegates-for-form-updates-from-worker-threads/
http://www.youtube.com/watch?v=h-DQywCJ_wY
所以总而言之,我需要在一个单独的线程上 ping 一个 IP,然后用 ping 的结果更改我的字典中的一个值(IE:超时,往返)。因为我需要更新我的字典,所以我需要将两个参数传递给线程,一个 IP 和一个用户为该计算机创建的唯一名称。谁能指出我正确的方向或提供一个我可以尝试学习的超级简单的例子?