Я разрабатываю приложение парсера для построения дерева вызовов из файлов DDL, которые были извлечены из базы данных.Идея состоит в том, чтобы взять большое количество этих файлов DDL и точно определить, что и как называется.Для этого я использую .NET TreeView.Окончательный вывод, к которому я работаю, выглядит примерно так:
-Proc1
-Proc2
-Proc3
-Proc4
-Proc2
-Proc3
-Proc3
-Proc4
Теперь все мои разборы работают правильно.Хотя этот процесс довольно длительный.Поэтому я решил перенести всю тяжеловесную обработку на собственный поток.Все работает так, как задумано, пока я не дохожу до того, что мне нужно обновить TreeView.Я пытаюсь сохранить всю актуальную логику обновления в отдельном потоке и обновлять только TreeView.Однако, несмотря на мою основную форму SyncLocked, я все еще получаю исключение, когда пытаюсь получить доступ к дереву.
В Интернете я нашел довольно много примеров, которые показывают, как использовать Делегаты для многопоточного доступа, но,к сожалению, все они немного упрощены для моих нужд.Наиболее просто показать, как установить свойство текста.Как я упоминал ранее, я пытаюсь сохранить как можно большую часть обработки в рабочем потоке и вызывать только соответствующие методы TreeView для обновления, поскольку этот процесс может быть довольно длительным (сотни процедур для анализа и отображения одновременно).
Есть ли хороший способ сделать это или я должен просто взять свои комки и передать все дерево зависимостей обратно в основную форму?
Вот код, который я сейчас использую для отображенияпервый уровень зависимостей.Помните, что это в конечном итоге будет рекурсивным (в настоящее время в режиме «заставить его работать»), поэтому я хочу оставить его вне потока пользовательского интерфейса:
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