VB.NET中的跨线程通信与字段更新

VB.NET中的跨线程通信与字段更新,vb.net,multithreading,visual-studio,visual-studio-2010,Vb.net,Multithreading,Visual Studio,Visual Studio 2010,在我的VB.NET 2010程序中,让跨线程通信/字段更新正常工作时遇到一些问题。每当我启动的线程抛出事件时,我都会尝试更新主窗体上的字段。以下是我的代码的简化版本: 我的主要表格: Public Class Main ' stuff ' Eventually, startProcessing gets called: Private Sub startProcessing() Dim processingClass = New MyProcessing

在我的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
如您所见,我的主类中的处理程序无法访问我需要的文本框,因为它是由不同的线程触发的(我想)。我尝试了许多其他方法来实现这一点,包括:

  • 将事件处理程序移动到
    MyProcessingClass
    ,并通过引用(ByRef)将
    txtMainFormTextBox
    传递给该类
  • 使实际线程从
    MyProcessingClass
    内部开始,而不是从
    Main
    内部开始

  • 这些都不起作用。很明显,我在这里遗漏了一个概念。完成这件事的最好方法是什么?谢谢

    您需要通过调用
    BeginInvoke
    更新UI线程上的文本框


    您应该使用,它可以为您完成所有这一切。

    只需处理
    DoWork
    ProgressChanged
    事件。

    使用
    BeginInvoke
    时,我无法传递数据,因此无法使用
    statusString
    。我会调查BackgroundWorker…@Mike:你可以把参数传递给
    BeginInvoke
    。只需使用
    操作(字符串)
    。但是,您应该使用BackgroundWorker。