我是 vb.net 的新手,使用不同的线程,所以我不知道如何使用 invoke 方法。我基本上想将 selected_item 分配为用户在 UI 线程的组合框中选择的项目。
Dim selected_item As String
If ComboBox1.InvokeRequired Then
selected_item = ComboBox1.Invoke(ComboBox1.SelectedItem)
Else
selected_item = ComboBox1.SelectedItem
End If
我得到错误跨线程操作无效。我该如何解决这个问题?
最佳答案
当您调用 Invoke
时,您需要指定一个在 UI 线程上调用的方法。如果您想获取一个值,该方法必须返回该值,然后 Invoke
将在您的辅助线程上返回相同的值。在你的情况下:
Private Function GetComboBox1SelectedItem() As Object
If ComboBox1.InvokeRequired Then
Return ComboBox1.Invoke(New Func(Of Object)(AddressOf GetComboBox1SelectedItem))
Else
Return ComboBox1.SelectedItem
End If
End Function
然后您可以在任何线程上调用该 GetComboBox1SelectedItem
方法,它会返回您当前选择的项目。
如果您在辅助线程上调用该方法,InvokeRequired
为 True
并且执行进入 If
block 。在该 block 中,Invoke
方法创建一个委托(delegate),将其编码到 UI 线程并调用它。该委托(delegate)用于相同的方法,因此它会第二次执行。第二次,我们在 UI 线程上,因此 InvokeRequired
为 False
并且执行进入 Else
block 。在该 block 中,检索并返回 Selecteditem
。 Invoke
方法然后返回由该方法的第二个实例返回的值以及由第一个实例返回的值。
您可能喜欢阅读 this有关如何构建此类方法及其实际作用的更严格的解释。
关于vb.net - 如何从 UI 线程检索信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72741272/