我家里有大约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操作时起作用。另外,我真的不明白它是如何工作的,并且无法在我的生活中修改它。
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:timeout,roundtrip)。 因为我需要更新我的字典,我需要将两个参数传递给线程,一个IP和一个用户为该计算机创建的唯一名称。任何人都可以指出我正确的方向或提供一个我可以尝试学习的超级简单的例子吗?
答案 0 :(得分:1)
一些非常粗略的想法。
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