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,因为它是由不同的线程触发的(我认为)。我已经尝试了一些其他的方法来得到这个工作,其中包括:
- 移动事件处理程序
MyProcessingClass
,并通过引用(为ByRef)到类路过txtMainFormTextBox
。 - 在
MyProcessingClass
而不是Main
之内有实际的线程启动。
这些都没有奏效。显然有一个我在这里失踪的概念。完成这件事的最好方法是什么?谢谢!
“BeginInvoke”的问题在于,当我使用它时我无法通过修改,所以我无法使用我的`statusString`。我会研究BackgroundWorker ... – 2011-01-24 01:31:56