如何从 UI 线程检索信息?

Nab*_*sof 2 vb.net visual-studio

我对 vb.net 很陌生,并且使用不同的线程,所以我不完全知道如何使用调用方法。我基本上想将 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
        
Run Code Online (Sandbox Code Playgroud)

我收到错误跨线程操作无效。我怎样才能解决这个问题?

Joh*_*ohn 5

调用时,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
Run Code Online (Sandbox Code Playgroud)

然后,您可以在任何线程上调用该GetComboBox1SelectedItem方法,它将返回当前选定的项目。

如果您在辅助线程上调用该方法,InvokeRequiredTrue执行将进入该If块。在该块中,该Invoke方法创建一个委托,将其编组到 UI 线程并调用它。该委托用于相同的方法,因此它会被第二次执行。第二次,我们位于 UI 线程上,并且InvokeRequired执行False进入Else块。在该块中,Selecteditem检索并返回 。然后,该Invoke方法返回该方法的第二个实例返回的值以及第一个实例返回的值。

您可能想阅读本文,以获得有关如何构建此类方法及其实际用途的更严格的解释。