Код должен:
- Найти список строк, которые содержат
inputStr
- Добавить их в список
ToolStripDropDown
одну за другой, без зависания пользовательского интерфейса
Я использую BackgroundWorker
, чтобы сделать это, со следующим кодом
Protected Overrides Sub OnTextChanged(e As EventArgs)
Dim bWorker As BackgroundWorker = New BackgroundWorker
'also tried to declare bWorker in class scope - no change
AddHandler bWorker.DoWork, AddressOf bw_DoWork
AddHandler bWorker.ProgressChanged, AddressOf bw_ProgressChanged
bWorker.WorkerReportsProgress = True
bWorker.WorkerSupportsCancellation = True
'Thread is confirmed as 1
bWorker.RunWorkerAsync(inputStr)
End Sub
Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
Dim matchList As List(Of String) = getMatchingList(e.Argument) 'Not listed, irrelevant
'Thread is different, as expected
For Each lineStr In matchList
bWorker.ReportProgress(0, lineStr)
Next
End Sub
Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
Dim lblList As Label = New Label With {.Text = e.UserState.ToString}
Dim hstItem As ToolStripControlHost = New ToolStripControlHost(lblList)
'Thread is different, unexpected
toolStripControl.Items.Add(hstItem) 'This line gives me the cross-thread error, since the thread is not 1
End Sub
Ради полноты, этот код находится в коде управления пользователя позади.Элемент управления генерируется во время выполнения в немодальной форме (я подтвердил номер потока как 1 во время создания элемента управления).Если я вызову ShowDialog
в форме, чтобы показать его как модальное, я не буду страдать от этой проблемы, но мне нужно, чтобы форма была немодальной.Я попытался создать элемент управления в конструкторе формы, событии Load и Shown без изменений.Я также попытался добавить фоновый рабочий элемент в пользовательский элемент управления во время разработки, опять же без изменений.