【问题标题】:What does 'InvokeRequired' and 'Invoke' mean in .Net?.Net 中的“InvokeRequired”和“Invoke”是什么意思?
【发布时间】:2013-09-06 17:00:55
【问题描述】:

我在一些我正在开发的程序中进行了很多线程化工作,我一直很好奇某些东西到底在做什么。

以下面的代码为例,它从一个线程运行以更新 UI:

Public Sub UpdateGrid() 
    If Me.InvokeRequired Then 
        Me.Invoke(New MethodInvoker(AddressOf UpdateGrid)) 
    Else 
        DataGridView1.DataSource = dtResults 
        DataGridView1.Refresh() 
        btnRun.Text = "Run Query" 
        btnRun.ForeColor = Color.Black 
    End If 
End Sub

Me.InvokeRequired 究竟检查什么,Me.Invoke 究竟在做什么?我知道它以某种方式让我可以访问 UI 上的项目,但它是如何实现的呢?

顺便说一句,假设 UpdateGrid() 是一个返回值并具有必需参数的函数。调用 Me.Invoke 方法后如何传递参数以及如何获取返回值?我在没有参数的情况下尝试了此操作,但返回“nothing”,并且在调用时我无法弄清楚如何附加参数。

【问题讨论】:

    标签: vb.net invoke


    【解决方案1】:

    Me.InvokeRequired 正在检查它是否在 UI 线程上,如果不等于 TrueMe.Invoke 正在请求委托来处理差异线程之间的通信。

    至于你的旁注。我通常使用一个事件来传递数据——这个事件仍然在 diff 线程上,但是像上面一样你可以委托工作。

    Public Sub UpdateGrid() 
        'why ask if I know it on a diff thread
        Me.Invoke(Sub() 'lambda sub
                   DataGridView1.DataSource = dtResults 
                   DataGridView1.Refresh() 
                   btnRun.Text = "Run Query" 
                   btnRun.ForeColor = Color.Black 
                  End Sub)
    End Sub
    

    【讨论】:

      【解决方案2】:

      Invoke() 确保调用的方法将在 UI 线程上调用。当您想在另一个线程(因此,不是 UI 线程)中进行 UI 调整时,这很有用。

      InvokeRequired 检查是否需要使用Invoke() 方法。

      【讨论】:

        【解决方案3】:

        从您发布的示例中,需要更新 UI 的部分是 Invoke 逻辑的一部分,而数据的检索可以在工作线程/后台线程上完成。

        If Me.InvokeRequired Then
        

        这会检查Invoke() 是否必要。

        Me.Invoke(New MethodInvoker(AddressOf UpdateGrid)) 
        

        这保证了此逻辑将在 UI 线程上运行,并且由于它正在处理与 UI(网格)的交互,因此如果您尝试在后台线程上运行它,它将无法正常工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-08
          • 2023-04-03
          • 1970-01-01
          • 2011-08-12
          相关资源
          最近更新 更多