2011-01-24 25 views
0

我在VB.NET 2010程序中正在进行跨线程通信/字段更新工作时遇到了一些麻烦。我试图更新我的主窗体上的一个字段,每当我开始的线程抛出一个事件。下面是我的代码的简化版本:VB.NET中的跨线程通信和字段更新

我的主要形式有:

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,并通过引用(为ByRef)到类路过txtMainFormTextBox
  2. MyProcessingClass而不是Main之内有实际的线程启动。

这些都没有奏效。显然有一个我在这里失踪的概念。完成这件事的最好方法是什么?谢谢!

回答

2

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


您应该使用BackgroundWorker component,这确实这一切为您服务。
只需处理DoWorkProgressChanged事件。

+0

“BeginInvoke”的问题在于,当我使用它时我无法通过修改,所以我无法使用我的`statusString`。我会研究BackgroundWorker ... – 2011-01-24 01:31:56