我正在開發一個解析器應用程序,用於從已從數據庫中提取的DDL文件構建調用樹。這個想法是採取大量的這些DDL文件,並確定究竟是什麼調用什麼。爲此,我正在使用.NET TreeView。我對工作的最終輸出是這樣的:現在在Visual Basic中鎖定另一個線程的控件
-Proc1
-Proc2
-Proc3
-Proc4
-Proc2
-Proc3
-Proc3
-Proc4
,我所有的解析工作正常。雖然這個過程非常漫長。因此,我決定將所有重量級處理都移到自己的線程中。一切都按預期工作,直到我需要更新我的TreeView。我試圖保留單獨線程上的所有實際更新邏輯,並只更新TreeView。但是,儘管我的主要形式是SyncLocked,但在嘗試訪問該樹時仍遇到異常。
我在網上發現了很多例子,展示瞭如何使用Delegates進行線程安全訪問,但不幸的是,它們都對我的需求有點簡單。大多數只是顯示如何設置文本屬性。正如我前面提到的那樣,我試圖在工作線程上儘可能多地進行處理,並且只調用相應的TreeView方法來更新,因爲此過程可能會很長時間(一次解析和顯示數百個過程) 。
是否有一個很好的方法來做到這一點,或者我應該把我的腫塊和我的整個依賴樹傳遞迴我的主窗體?
這是我目前用來顯示第一級依賴關係的代碼。請記住,這最終將是遞歸的(目前在「搞不定」模式),這就是爲什麼我要保持它關閉UI線程:
Public Sub updateTreeView()
Dim arrNodeList As ArrayList
Dim childNode As clsProcedureNode
Dim currentNode As clsProcedureNode
Dim intChildIndex As Integer
Dim intNodeListIndex As Integer
Dim treeView As TreeView
//Lock main form
SyncLock mMainForm
//Check that we are actually running on a seprate thread
If mMainForm.InvokeRequired() = True Then
//Call delegate to get handle to TreeView
treeView = mMainForm.Invoke(mGetTreeViewDelegate)
//Add Parsed array to main form TreeView
For intNodeListIndex = 0 To mProcedureNodes.Length - 1
//Get current node and its child list
currentNode = mProcedureNodes(intNodeListIndex)
arrNodeList = currentNode.getProcsCalled()
//Add node and all children to TreeView
With treeView
.BeginUpdate()
.Nodes.Add(currentNode.getName())
For intChildIndex = 0 To arrNodeList.Count
childNode = arrNodeList.Item(intChildIndex)
.Nodes(intNodeListIndex).Nodes.Add(childNode.getName())
Next
.EndUpdate()
End With
Next
End If
End SyncLock
End Sub
你不需要在UI線程上操作樹視圖嗎?您將樹視圖拉出主窗體,然後將其填充到線程中。我認爲你需要將數據傳遞迴UI線程,然後將其填充到那裏。 – ChrisWue 2011-03-18 22:43:55
這實際上是我想要避免的。該過程分兩步進行。解析DDL文件,然後構建樹。由於我正在使用的數據集非常大且具有遞歸性質,因此我正嘗試執行脫機線程樹,以便在填充樹時UI不會掛起。 – phobos51594 2011-03-18 22:58:58