VB.net将值设置为backgroundworker中的标签

Mar*_*tes 1 vb.net backgroundworker

我的代码有效,但我怀疑我做了什么,因为我将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
Run Code Online (Sandbox Code Playgroud)

有没有办法在不将CheckForIllegalCrossThreadCalls设置为False的情况下将值设置为backgroundworker中的标签?因为我的程序遇到了一些错误,即使尚未达到计数器限制,循环也会突然停止.

Urs*_*osu 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)
Run Code Online (Sandbox Code Playgroud)

并在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

我不能比他更好地解释,因为我也是一个菜鸟

  • @MarcIntes"不影响我的背景工作者的表现"?后台工作人员将等待您完成更新任何GUI元素.嗯...我认为我已经解释了很多,并且不喜欢某种态度.你已经获得了你的信息,现在我将删除我的答案(打算不回答OP表现出的行为我不认为这是可以辩护的,这件事一直在询问和询问并忘记原始问题并从中获取一些知识这里和那里的一些知识......我认为不应该在SO中提升. (3认同)