VB.NET调用方法

Red*_*der 4 vb.net multithreading delegates

我的代码中有这个方法:

Private Sub Display()
        Received.AppendText(" - " & RXArray)
End Sub
Run Code Online (Sandbox Code Playgroud)

这2个电话之间有什么区别:

Me.Invoke(New MethodInvoker(AddressOf Display))
Run Code Online (Sandbox Code Playgroud)

Display()
Run Code Online (Sandbox Code Playgroud)

我知道这是关于线程的事情,但我不确定.

提前致谢

jor*_*jor 7

Invoke当你在不同的线程中工作时使用方式.例如,如果调用者与GUI不在同一个线程中.

如果调用者不需要等待方法的结果,您甚至可以使用BeginInvoke:

GuiObject.BeginInvoke(New MethodInvoker(AddressOf Display))
Run Code Online (Sandbox Code Playgroud)

或更短:

GuiObject.BeginInvoke(Sub() Display)
Run Code Online (Sandbox Code Playgroud)

为了更容易编写,您可以将调用移动到Display函数中:

Private Sub Display()
    If Me.InvokeRequired Then
        Me.Invoke(Sub() Display)
        Return
    End IF
    Received.AppendText(" - " & RXArray)
End Sub
Run Code Online (Sandbox Code Playgroud)

这样调用者不必知道他是否在同一个线程中.

  • 就个人而言,我讨厌使用递归 - 第一次阅读代码的人必须花费精力来理解为什么需要递归,并确保它不会导致无限循环.恕我直言写一个私有子`DisplayMustBeOnUIThread`来完成工作,然后是一个包装器子程序`Display`直接调用它或者如果需要调用它.`Private Sub Display()``如果Me.InvokeRequired那么Me.Invoke(Sub()DisplayMustBeOnUIThread)Else DisplayMustBeOnUIThread()``End Sub` (2认同)

小智 5

在另一个答案中添加参数:

Private Sub Display(ByVal strParam As String)
    If Me.InvokeRequired Then
        Me.Invoke(Sub() Display(strParam))
        Return
    End IF
    Received.AppendText(" - " & RXArray)
End Sub
Run Code Online (Sandbox Code Playgroud)