我在BackgroundWorker
例程的DoWork
中运行以下代码
Dim P As String
Dim B As Integer
P = "Verifying User Inputs"
B = B + 1
If SubjectName.Text = "" Then
P = "No Subject Name Entered"
InputValidate.ReportProgress(B, P)
Threading.Thread.Sleep(250)
Else
B = B + 1
End If
If AgencyReferrer.Text = "" Or AgencyReferrer.Text = "Configure In Settings" Then
P = "No Agency Of Referrer Selected"
InputValidate.ReportProgress(B, P)
Threading.Thread.Sleep(250)
Else
B = B + 1
End If
SubjectName
是Textbox
,AgencyReferrer
是Combobox
。
代码的Texbox
部分完成没有任何问题,但Combobox
部分无法说:
类型' System.InvalidOperationException'的例外情况发生在 System.Windows.Forms.dll但未在用户代码中处理
附加信息:跨线程操作无效:控制 ' AgencyReferrer'从线程以外的线程访问 创建于。
我无法理解Texbox
与Combobox
的区别对待方式只是检查文本值是什么。
有什么想法吗?
答案 0 :(得分:0)
您无法访问或更新大多数控件'跨越线程边界的成员。在某些情况下,访问TextBox.Text
可能会失败,在大多数情况下它会起作用。它不能保证有效。
无需更改太多代码,您可以使用Control.Invoke()
使ComboBox正常工作。即使TextBox Text属性有效,您也应该调用该调用。
Dim P As String
Dim B As Integer
Dim agencyReferrerText = AgencyReferrer.Invoke(New Func(Of String)(Function() AgencyReferrer.Text))
P = "Verifying User Inputs"
B = B + 1
If SubjectName.Text = "" Then
P = "No Subject Name Entered"
InputValidate.ReportProgress(B, P)
Threading.Thread.Sleep(250)
Else
B = B + 1
End If
If agencyReferrerText = "" Or agencyReferrerText = "Configure In Settings" Then
P = "No Agency Of Referrer Selected"
InputValidate.ReportProgress(B, P)
Threading.Thread.Sleep(250)
Else
B = B + 1
End If
调用这些调用可能很麻烦,因此请参阅How to change textbox.text while in backgroundworker?有关自动调用Invoke-If-Required模式的方法。您可以执行类似的检索属性。