Межпоточная коммуникация и обновление полей в VB.NET - PullRequest
0 голосов
/ 24 января 2011

У меня возникли проблемы с правильной работой межпотокового взаимодействия / обновления полей в моей программе 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, так как он был запущен другим потоком (я думаю). Я пробовал ряд других подходов, чтобы заставить это работать, в том числе:

  1. Перемещение обработчика событий на MyProcessingClass и передача txtMainFormTextBox по ссылке (ByRef) в класс.
  2. Фактическое начало потока внутри MyProcessingClass вместо Main.

Ничего из этого не сработало. Понятно, что здесь есть понятие, которое мне не хватает. Какой лучший способ сделать это? Спасибо!

1 Ответ

2 голосов
/ 24 января 2011

Вам необходимо обновить текстовое поле в потоке пользовательского интерфейса, вызвав BeginInvoke.


Вы должны использовать BackgroundWorker компонент , который сделает все это за вас.
Просто обработайте события DoWork и ProgressChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...