Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VB.net将值设置为backgroundworker内的标签_Vb.net_Backgroundworker - Fatal编程技术网

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

VB.net将值设置为backgroundworker内的标签,vb.net,backgroundworker,Vb.net,Backgroundworker,我的代码可以正常工作,但我对我所做的表示怀疑,因为我将CheckForIllegalCrossThreadCalls设置为false,我认为这会给我的后台工作人员带来一些副作用。以下是我的示例代码: Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False

我的代码可以正常工作,但我对我所做的表示怀疑,因为我将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
Private Sub Form1\u Load(发送方作为对象,e作为事件参数)处理MyBase.Load
System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=False
端接头
Private Sub go_Click(发件人作为对象,e作为事件参数)处理go。单击
尝试
如果BackgroundWorker1.IsBusy为True,则
BackgroundWorker1.RunWorkerAsync()
resetevent.Set()
如果结束
特例
结束尝试
端接头
私有子BackgroundWorker1_DoWork(发送方作为System.Object,e作为System.ComponentModel.DoWorkEventArgs)处理BackgroundWorker1.DoWork
做
标签1.Text=x
Label2.Text=Label1.Text
Label3.Text=Label2.Tex
Label4.Text=Label3.Text
Label5.Text=Label4.Text
x+=1
循环时间(x<100)
端接头
私有子BackgroundWorker1\u ProgressChanged(发送方作为System.Object,e作为System.ComponentModel.ProgressChangedEventArgs)处理BackgroundWorker1.ProgressChanged
尝试
特例
结束尝试
端接头
私有子BackgroundWorker1_已完成(发件人作为System.Object,e作为System.ComponentModel.RunWorkerCompletedEventArgs)处理BackgroundWorker1.RunWorkerCompleted
尝试
特例
结束尝试
端接头

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

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

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

因此,如果在UI线程上创建了
BackGroundWorker
,则可以更新UI,从而无需
检查非法CrossThreadCalls

资料来源:


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

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

因此,如果在UI线程上创建了
BackGroundWorker
,则可以更新UI,从而无需
检查非法CrossThreadCalls

资料来源:

创建方法

  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中调用SetLabelText

编辑: 我现在有点忙,稍后会在参考资料中添加解释。 我也有你的问题,这对我很有效

编辑:

从工作线程安全访问控件的方法是通过委派。 首先测试控件的InvokeRequired属性,该属性将告诉您是否可以安全地访问该控件。InvokeRequired是该控件类中少数线程安全的成员之一,因此您可以在任何地方访问它。如果该属性为True,则需要调用来访问该控件,因为当前方法是在拥有控件句柄的线程以外的线程上执行

调用是通过调用控件的Invoke或BeginInvoke方法来执行的。您可以创建一个委托,该委托是一个包含对某个方法的引用的对象。最好将该委托作为对当前方法的引用。然后将该委托传递给Invoke或BeginInvoke方法。这将本质上调用被引用的方法同样,这次是在拥有控件句柄的线程上。”

来源:jmcilhinneypost从工作线程访问控件

我不能比他解释得更好,因为我是一个noob,也创建了这个方法

  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中调用SetLabelText

编辑: 我现在有点忙,稍后会在参考资料中添加解释。 我也有你的问题,这对我很有效

编辑:

从工作线程安全访问控件的方法是通过委派。 首先测试控件的InvokeRequired属性,该属性将告诉您是否可以安全地访问该控件。InvokeRequired是该控件类中少数线程安全的成员之一,因此您可以在任何地方访问它。如果该属性为True,则需要调用来访问该控件,因为当前方法是在拥有控件句柄的线程以外的线程上执行

调用是通过调用控件的Invoke或BeginInvoke方法来执行的。您可以创建一个委托,该委托是一个包含对某个方法的引用的对象。最好将该委托作为对当前方法的引用。然后将该委托传递给Invoke或BeginInvoke方法。这将本质上调用被引用的方法同样,这次是在拥有控件句柄的线程上。”

来源:jmcilhinneypost从工作线程访问控件


我不能比他解释得更好,因为我也是一个noob(noob)

只要在你的表单上添加这行代码就可以了


Control.CheckForIllegalCrossThreadCalls=False

只需在表单上添加这行代码即可。加载后,就可以了


Control.CheckForIllegalCrossThreadCalls=False

我不确定这个答案在我的上面给出了什么;但在任何情况下,OP都认为使用CheckForIllegalCrossThreadCalls是可以接受的,只是想确认是否是这样(您甚至没有提到,只是建议了一种替代方案)。通过执行您的建议(与我的建议完全相同:不要从backgroundworker线程调用GUI),他将不得不完全更改代码。总而言之:我不确定