vb.net - 如何从 UI 线程检索信息?

标签 vb.net visual-studio

我是 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 方法,它会返回您当前选择的项目。

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

您可能喜欢阅读 this有关如何构建此类方法及其实际作用的更严格的解释。

关于vb.net - 如何从 UI 线程检索信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72741272/

相关文章:

c# - 为什么 decimal 不是原始类型?

c# - 在 UserControl 中的 TextBox 具有焦点时处理 UserControl 中的箭头键以选择列表项

wpf - 尝试以编程方式滚动滚动查看器

visual-studio - 在 Visual Studio 中向编辑器添加指南

visual-studio - 我的 Visual Studio 解决方案文件夹下的 "storage.ide"文件是什么? "persistent storage"是什么?

xml - LINQ to XML 和 Distinct 自定义类

vb.net - 如何查找当前使用的VB版本?

C++ - 将结构类型数组传递给用户定义的函数

c# - #if 调试 --> #if myOwnConfig?

c++ - 无法在 VS2015 中重定向项目