1

我的代码有效,但我怀疑我做了什么,因为我将 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 的情况下为后台工作人员中的标签设置值?因为我的程序遇到了一些错误,即使尚未达到计数器限制,循环也会突然停止。

4

3 回答 3

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,则需要调用才能访问控件,因为当前方法是在拥有控件句柄的线程之外的线程上执行的。

通过调用控件的 Invoke 或 BeginInvoke 方法来执行调用。您创建一个委托,它是一个包含对方法的引用的对象。将其作为当前方法的参考是一种很好的做法。然后将该委托传递给 Invoke 或 BeginInvoke 方法。这实际上将再次调用引用的方法,这次是在拥有控件句柄的线程上。”

来源:jmcilhinney发布从工作线程访问控件 http://www.vbforums.com/showthread.php?498387-Accessing-Controls-from-Worker-Threads

我无法比他更好地解释,因为我也是菜鸟

于 2013-09-17T08:51:54.510 回答
3

ProgressChanged活动期间,您可以访问 MSDN 文档中所述的 UI:

ProgressChanged 事件处理程序在创建 BackgroundWorker 的线程上执行。

因此,如果您在BackGroundWorkerUI 线程上创建了CheckForIllegalCrossThreadCalls

资源:

MSDN后台工作者

于 2013-09-17T08:45:42.087 回答
0

只需在您的 Form.Load 中添加这行代码,就可以了。

Control.CheckForIllegalCrossThreadCalls = False

于 2017-04-17T16:42:22.970 回答