VB.NET中采用多线程填写treeview控件
【IT168 技术文档】
多线程的编写:结构合理、注意同步。
Imports System.IO

Public Class Form1Class Form1
Inherits System.Windows.Forms.Form

...#Region " Windows 窗体设计器生成的代码 "

Public Sub New()Sub New()
MyBase.New()
'该调用是 Windows 窗体设计器所必需的。
InitializeComponent()
'在 InitializeComponent() 调用之后添加任何初始化
End Sub
'窗体重写 dispose 以清理组件列表。

Protected Overloads Overrides Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
'Windows 窗体设计器所必需的
Private components As System.ComponentModel.IContainer
'注意: 以下过程是 Windows 窗体设计器所必需的
'可以使用 Windows 窗体设计器修改此过程。
'不要使用代码编辑器修改它。
Friend WithEvents TreeView1 As System.Windows.Forms.TreeView
Friend WithEvents btnOpenBrower As System.Windows.Forms.Button
Friend WithEvents ImageList1 As System.Windows.Forms.ImageList

<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
Me.components = New System.ComponentModel.Container
Dim resources As System.Resources.ResourceManager = _
New System.Resources.ResourceManager(GetType(Form1))
Me.TreeView1 = New System.Windows.Forms.TreeView
Me.ImageList1 = New System.Windows.Forms.ImageList(Me.components)
Me.btnOpenBrower = New System.Windows.Forms.Button
Me.SuspendLayout()
'
'TreeView1
'
Me.TreeView1.Dock = System.Windows.Forms.DockStyle.Left
Me.TreeView1.ImageList = Me.ImageList1
Me.TreeView1.Location = New System.Drawing.Point(0, 0)
Me.TreeView1.Name = "TreeView1"
Me.TreeView1.Size = New System.Drawing.Size(376, 581)
Me.TreeView1.TabIndex = 0
'
'ImageList1
'
Me.ImageList1.ImageSize = New System.Drawing.Size(16, 16)
Me.ImageList1.ImageStream = CType(resources.GetObject_
("ImageList1.ImageStream"), System.Windows.Forms.ImageListStreamer)
Me.ImageList1.TransparentColor = System.Drawing.Color.Transparent
'
'btnOpenBrower
'
Me.btnOpenBrower.Location = New System.Drawing.Point(408, 64)
Me.btnOpenBrower.Name = "btnOpenBrower"
Me.btnOpenBrower.Size = New System.Drawing.Size(96, 23)
Me.btnOpenBrower.TabIndex = 1
Me.btnOpenBrower.Text = "Open Brower"
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)
Me.ClientSize = New System.Drawing.Size(536, 581)
Me.Controls.Add(Me.btnOpenBrower)
Me.Controls.Add(Me.TreeView1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
#End Region

Private Sub OpenBrower()Sub OpenBrower()
Dim f As New FolderBrowserDialog
If f.ShowDialog = DialogResult.OK Then
Me.TreeView1.Nodes.Clear()
Me.SuspendLayout()
Dim nodeTemp As TreeNode = CType(Me.Invoke_
(New AddTreeNodeHandler(AddressOf Me.AddFileToTreeview),_
New Object() {f.SelectedPath}), TreeNode)
Me.AddFile(New DirectoryInfo(f.SelectedPath), nodeTemp)
Me.ResumeLayout(False)
End If
End Sub

Private Sub AddFile()Sub AddFile(ByVal dirPath As DirectoryInfo, ByVal node As TreeNode)
Dim tempHandler As New AddFileHandler(AddressOf Me.AddFileToTreeNode)
For Each dir As DirectoryInfo In dirPath.GetDirectories()
Dim nodeTemp As TreeNode = CType(Me.Invoke_
(tempHandler, New Object() {dir.Name, CLASSIO.Directory, node}), TreeNode)
Me.AddFile(dir, nodeTemp)
Next
For Each file As FileInfo In dirPath.GetFiles("*.dll")
Me.Invoke(tempHandler, New Object() {file.Name, CLASSIO.File, node})
Next
End Sub

Private Function AddFileToTreeNode()Function AddFileToTreeNode(ByVal str As String,_
ByVal cls As CLASSIO, ByVal node As TreeNode) As TreeNode
Dim nodeTemp As New TreeNode(str)
nodeTemp.ImageIndex = CInt(cls)
node.Nodes.Add(nodeTemp)
nodeTemp.SelectedImageIndex = nodeTemp.ImageIndex
Return nodeTemp
End Function

Private Function AddFileToTreeview()Function AddFileToTreeview(ByVal str As String) As TreeNode
Dim nodeTemp As New TreeNode(str)
Me.TreeView1.Nodes.Add(nodeTemp)
Return nodeTemp
nodeTemp.SelectedImageIndex = CInt(CLASSIO.Directory)
End Function

Private Sub btnOpenBrower_Click()Sub btnOpenBrower_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles btnOpenBrower.Click
'多线程
Dim t As Threading.Thread = New Threading.Thread(AddressOf Me.OpenBrower)
t.Start()
'单线程
'Me.OpenBrower()
End Sub
End Class

Public Enum CLASSIOEnum CLASSIO
File = 1
Directory = 0
End Enum

Public Delegate Function AddFileHandler()Function AddFileHandler(ByVal str As String,_
ByVal cls As CLASSIO, ByVal Node As TreeNode) As TreeNode

Public Delegate Function AddTreeNodeHandler()Function AddTreeNodeHandler(ByVal str As String) As TreeNode