VB.NET中的跨线程通信与字段更新
在我的VB.NET 2010程序中,让跨线程通信/字段更新正常工作时遇到一些问题。每当我启动的线程抛出事件时,我都会尝试更新主窗体上的字段。以下是我的代码的简化版本: 我的主要表格: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
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。