【发布时间】:2017-06-11 11:54:56
【问题描述】:
使用下面的代码,我在 MainForm LoadEvent 中用一个根节点和几个子节点填充 Treeview。使用按钮 btnPing 我遍历节点并搜索级别 2 的子节点。然后使用 My.computer.network.ping 查询这些节点,并且 ChildNode 的 ForeColor 根据结果红色或绿色着色。整部作品是同义词。然而,图形用户界面每次都让我冻结。
'### TreeView Test
Option Explicit On
Option Strict On
Public Partial Class MainForm
Public Sub New()
Me.InitializeComponent()
End Sub
'### Hauptprogramm wird geladen ###
Sub MainFormLoad(sender As Object, e As EventArgs)
'Treeview befüllen
With treeView1
.Nodes.Add("Test1")
.Nodes(0).Nodes.Add("Test1_a")
.Nodes(0).Nodes.Add("Test1_b")
.Nodes(0).Nodes.Add("Test1_c")
.Nodes(0).Nodes(0).Nodes.Add("10.23.59.1")
.Nodes(0).Nodes(1).Nodes.Add("10.23.59.90")
.Nodes(0).Nodes(1).Nodes.Add("10.23.59.90")
.Nodes(0).Nodes(2).Nodes.Add("10.23.59.10")
.Nodes(0).Nodes(2).Nodes.Add("10.23.59.11")
.Nodes(0).Nodes(2).Nodes.Add("10.23.59.12")
.Nodes(0).Nodes(2).Nodes.Add("10.23.59.13")
.Nodes(0).Nodes(2).Nodes.Add("10.23.59.14")
End With
'Treeview aufklappen
treeView1.ExpandAll
End Sub
'### Sub zum rekursiven durchsuchen der Nodes ###
Private Sub RecurseNodes(ByVal col As TreeNodeCollection)
For Each tn As TreeNode In col
If tn.Level = 2 Then
Try
If My.Computer.Network.Ping(tn.Text) Then
tn.ForeColor = Color.Green
tn.StateImageIndex= 4
Else
tn.ForeColor = Color.Red
tn.StateImageIndex=5
End If
Catch ex As Exception
tn.ForeColor = Color.Red
tn.StateImageIndex=5
End Try
End If
If tn.Nodes.Count > 0 Then
RecurseNodes(tn.Nodes)
End If
Next tn
End Sub
'### Button zum starten der rekursiven Suche ###
Sub BtnPingClick(sender As Object, e As EventArgs)
'Treeview rekursiv durchsuchen
RecurseNodes(treeView1.Nodes)
End Sub
End Class
现在我想转换整体,以便 Ping 在单独的线程中运行。现在我对这个过程只有一个理解问题。我可以用参数传输启动一个线程吗?然后我将遍历列表并从具有 2 级线程的每个节点开始并等待反馈。最好的方法是什么?
最好的问候 凯
【问题讨论】:
-
别这样,Ping 类已经knows how to do that。使用 PingCompleted 事件更新您的 UI。
标签: vb.net multithreading treeview