使用以下代码,我在MainForm LoadEvent中使用根节点和几个子节点填充Treeview。使用按钮btnPing,我遍历节点并搜索级别为2的子节点。然后使用My.computer.network.ping查询这些节点,并根据结果红色或绿色对ChildNode的ForeColor进行着色。整个作品是同义词。但是,GUI每次都会冻结我。
'### 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级是一个线程并等待反馈。最好的方法是什么?
最诚挚的问候 凯
答案 0 :(得分:1)
这是另一种方法:
Sub BtnPingClick(sender As Object, e As EventArgs)
'Treeview rekursiv durchsuchen
RecurseNodes(TreeView1.Nodes)
End Sub
Private Async Sub RecurseNodes(ByVal col As TreeNodeCollection)
For Each tn As TreeNode In col
If tn.Level = 2 Then
Dim T As Task(Of Boolean) = Ping(tn.Text)
Await T
tn.ForeColor = If(T.Result, Color.Green, Color.Red)
tn.StateImageIndex = If(T.Result, 4, 5)
ElseIf tn.Nodes.Count > 0 Then
RecurseNodes(tn.Nodes)
End If
Next tn
End Sub
Private Function Ping(ByVal ip As String) As Task(Of Boolean)
Return Task.Factory.StartNew(Of Boolean)(
Function() As Boolean
Try
Return My.Computer.Network.Ping(ip)
Catch ex As Exception
Return False
End Try
End Function)
End Function
答案 1 :(得分:0)
一些想法......
m