我的代码有效,但我对我所做的事情有疑问,因为我将CheckForIllegalCrossThreadCalls设置为false,我认为这会给我的后台工作人员带来一些副作用。这是我的示例代码:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
End Sub
Private Sub go_Click(sender As Object, e As EventArgs) Handles go.Click
Try
If BackgroundWorker1.IsBusy <> True Then
BackgroundWorker1.RunWorkerAsync()
resetevent.Set()
End If
Catch ex As Exception
End Try
End Sub
Private Sub BackgroundWorker1_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Do
Label1.Text = x
Label2.Text = Label1.Text
Label3.Text = Label2.Tex
Label4.Text = Label3.Text
Label5.Text = Label4.Text
x+=1
Loop While (x < 100)
End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
Try
Catch ex As Exception
End Try
End Sub
Private Sub BackgroundWorker1_Completed(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
Try
Catch ex As Exception
End Try
End Sub
我是否有办法在不将CheckForIllegalCrossThreadCalls设置为False的情况下为背景工作者中的标签设置值?因为我的程序遇到了一些错误,即使尚未达到计数器限制,循环也会突然停止。
答案 0 :(得分:8)
创建方法
Private Sub setLabelTxt(ByVal text As String, ByVal lbl As Label)
If lbl.InvokeRequired Then
lbl.Invoke(New setLabelTxtInvoker(AddressOf setLabelTxt), text, lbl)
Else
lbl.Text = text
End If
End Sub
Private Delegate Sub setLabelTxtInvoker(ByVal text As String, ByVal lbl As Label)
并在DoWork中调用setLabelTxt。
修改强> 稍后我将通过引用添加解释,因为我现在有点忙。 我也有你的问题,这对我有用。
修改强>
“从工作线程安全访问控件的方法是通过委派。 首先,您测试控件的InvokeRequired属性,该属性将告诉您是否可以安全地访问该控件。 InvokeRequired是Control类的少数几个线程安全的成员之一,因此您可以在任何地方访问它。如果属性为True,则需要调用才能访问控件,因为当前方法在拥有控件Handle的线程以外的线程上执行。
通过调用控件的Invoke或BeginInvoke方法来执行调用。您创建一个委托,该委托是一个包含对方法的引用的对象。最好将其作为对当前方法的引用。然后,您将该委托传递给Invoke或BeginInvoke方法。这将基本上再次调用引用的方法,这次是在拥有控件的Handle的线程上。“
来源: jmcilhinney 发布从工作线程访问控件 http://www.vbforums.com/showthread.php?498387-Accessing-Controls-from-Worker-Threads
我不能比他更好地解释,因为我也是一个菜鸟
答案 1 :(得分:3)
在ProgressChanged
事件期间,您可以按照MSDN文档中的说明访问用户界面:
ProgressChanged事件处理程序在创建BackgroundWorker的线程上执行。
因此,如果您在UI线程上创建了BackGroundWorker
,则可以更新用户界面,从而无需CheckForIllegalCrossThreadCalls
来源:
答案 2 :(得分:0)
只需在Form.Load上添加这行代码,就可以了。
Control.CheckForIllegalCrossThreadCalls = False