从分离的Thread更改TreeView节点的前景色

时间:2017-06-11 11:54:56

标签: vb.net multithreading treeview

使用以下代码,我在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级是一个线程并等待反馈。最好的方法是什么?

最诚挚的问候 凯

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