使用以下代碼,我在MainForm LoadEvent中填充具有根節點和多個子節點的Treeview。使用按鈕btnPing,我瀏覽節點並搜索級別爲2的子節點。然後使用My.computer.network.ping查詢這些節點,並根據結果紅色或綠色對ChildNode的ForeColor進行着色。整個作品是同義詞。但是,GUI每次都凍結我。從單獨的線程更改TreeView節點的前景色
'### 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級線程的節點開始,等待反饋。最好的方法將如何?
問候 凱
只是不,平安類已經[知道如何做到這一點] (https://msdn.microsoft.com/en-us/library/xya3e0zf(v=vs.110).aspx?cs-save-lang=1&cs-lang=vb#code-snippet-1)。使用PingCompleted事件更新您的用戶界面。 –