У меня много проблем с попыткой заставить фонового работника нормально функционировать, чтобы заполнить пару узлов TreeView. В указанном TreeView у меня есть несколько уровней узлов. Например
Модель относится к модели MicroStation (программа для рисования CAD), проще всего объяснить, что это лист внутри электронной таблицы.
Я использую FileDialog для выбора файлов, после того как файлы выбраны, каждое имя файла добавляется в TreeView со своим собственным узлом.
Идея состоит в том, что программа затем откроет каждый файл, просканирует каждую модель и добавит вспомогательный TreeNode под узлом файлов с типом теста и результатом.
Функция DoWork для фонового работника приведена ниже. Я удалил много кода просто для моего поста. Но есть 7 «тестов», которые выполняет программа, я включил 2.
В приведенном ниже примере «CheckFonts» - это функция, которая просто считает элементы текста в файле и возвращает число.
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
For i As Integer = 0 To m_CountTo
If BackgroundWorker1.CancellationPending Then
e.Cancel = True ' Set Cancel to True
Exit For
End If
Dim sError As String = ""
Dim bBorderFound As Boolean = False
Dim oDesignFile As DesignFile
Dim oModel As ModelReference
Dim oFontNode As New TreeNode
Dim oFontResultNode As New TreeNode
For Each oNode As TreeNode In trvItems.Nodes
Dim ustn As New MicroStationDGN.Application
oDesignFile = ustn.OpenDesignFileForProgram(oNode.Text, True)
For Each oModel In oDesignFile.Models
'####### Checks for Items on Default Level #######
If bDefaultPass = True Then
Dim iDefaultItems As Long
iDefaultItems = DefaultItems(oModel)
If iDefaultItems > 0 Then
sDefaultMessage = "There are " & iDefaultItems & " items on the Default Level"
bDefaultPass = False
Else
sDefaultMessage = "There are no items on the Default Level"
bDefaultPass = True
End If
End If
'####### Checks for Non Standard Fonts #######
If bFontPass = True Then
Dim iFontCheck As Long
iFontCheck = CheckFonts(oModel)
If iFontCheck > 0 Then
sFontMessage = "There are " & iFontCheck & " Text Elements that use a Non Standard Font."
bFontPass = False
ElseIf iFontCheck = -99999 Then
sFontMessage = "There are some corrupt or invalid Fonts used in the Design File"
bFontPass = False
Else
sFontMessage = "All Text Elements use the Correct Font"
bFontPass = True
End If
End If
Next ' End Model
oFontNode = oNode.Nodes.Add("Font Check")
oFontResultNode = oFontNode.Nodes.Add("")
If bFontPass = True Then
oFontResultNode.Text = "PASS - " & sFontMessage
oFontResultNode.ImageIndex = 0
oNode.Collapse()
Else
oFontResultNode.Text = "FAIL - " & sFontMessage
bPass = False
oFontResultNode.ImageIndex = 1
oFontNode.ImageIndex = 1
oNode.Expand()
oFontNode.Expand()
End If
oDefaultItemsNode = oNode.Nodes.Add("Default Items Check")
oDefaultItemsResultNode = oDefaultItemsNode.Nodes.Add("")
If bDefaultPass = True Then
oDefaultItemsResultNode.Text = "PASS - " & sDefaultMessage
oDefaultItemsResultNode.ImageIndex = 0
oNode.Collapse()
Else
oDefaultItemsResultNode.Text = "FAIL - " & sDefaultMessage
oDefaultItemsResultNode.ImageIndex = 1
oDefaultItemsResultNode.ImageIndex = 1
oNode.Expand()
bPass = False
End If
Next ' End File
Next
End Sub
Раньше я работал с фоновыми рабочими, но это немного сложнее того, что я сделал, я понимаю, что вы не можете обновить элементы управления из другого потока и что Invoke используется для передачи ему информации. Но я запутался, как это сделать с несколькими узлами. Лучший пример, который я видел, был здесь
Добавление узлов в древовидную структуру с помощью Begin Invoke / Invoke
Но с несколькими узлами код стал довольно запутанным и не работал. Сообщение об ошибке продолжает появляться относительно вызываемого Invoke / BeginInvoke.
Итак, я думаю, что мой главный вопрос - где я мог бы вызвать команду Invoke, чтобы лучше всего использовать Фоновый рабочий?
Заранее спасибо !!