У меня возникли проблемы с правильной работой межпотокового взаимодействия / обновления полей в моей программе VB.NET 2010. Я пытаюсь обновить поле в моей главной форме всякий раз, когда поток, который я начал, генерирует событие. Вот упрощенная версия моего кода:
Моя основная форма:
Public Class Main
' stuff
' Eventually, startProcessing gets called:
Private Sub startProcessing()
Dim processingClass = New MyProcessingClass("whatever")
AddHandler processingClass.processStatusUpdate, AddressOf handleProcessStatusUpdate
Dim processingThread = New Thread(AddressOf processingClass.process)
processingThread.Start()
End Sub
Private Sub handleProcessStatusUpdate(statusUpdate As String)
txtMainFormTextBox.Text = statusUpdate ' InvalidOperationException
' "Cross-threaded operation not valid: Control 'txtMainFormTextBox' accessed from a thread other than the thread it was created on"
End Sub
End Class
Класс, который вызывает событие:
Public Class MyProcessingClass
Private whatever As String
Public Event processStatusUpdate(status As String)
Public Sub New(inWhatever As String)
whatever = inWhatever
End Sub
Public Sub process()
' do some stuff
RaiseEvent processStatusUpdate(whatever)
End Sub
End Class
Как видите, обработчик в моем основном классе не имеет доступа к нужному мне TextBox, так как он был запущен другим потоком (я думаю). Я пробовал ряд других подходов, чтобы заставить это работать, в том числе:
- Перемещение обработчика событий на
MyProcessingClass
и передача txtMainFormTextBox
по ссылке (ByRef) в класс.
- Фактическое начало потока внутри
MyProcessingClass
вместо Main
.
Ничего из этого не сработало. Понятно, что здесь есть понятие, которое мне не хватает. Какой лучший способ сделать это? Спасибо!