Событие BackgroundWorker ProgressChanged запускается в новом потоке, что приводит к ошибке в потоке в немодальной форме - PullRequest
0 голосов
/ 28 февраля 2019

Код должен:

  • Найти список строк, которые содержат 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 без изменений.Я также попытался добавить фоновый рабочий элемент в пользовательский элемент управления во время разработки, опять же без изменений.

...