首页 > 解决方案 > 调用、BeginInvoke / EndInvoke 还是 InvokeAsync?什么时候用什么,为什么用?

问题描述

参考通过 System.Management.Automation 在 VB 或 C# 中使用 PowerShell

我知道 Invoke 同步运行,使用 BeginInvoke / EndInvoke 意味着您可以异步执行相同的操作。

但是我今天注意到还有 InvokeAsync

谁能向我解释使用此方法优于其他方法的好处以及我应该使用的特定方法?

我看到的大多数示例将 Invoke 用于基本命令,将 BeginInvoke / EndInvoke 用于更长时间运行的任务。

只是想学习最好的方法,并了解在无法像其他人那样在 InvokeAsync 上找到太多文档时使用什么。

更新:下面使用 Invoke 或 BeginInvoke/EndInvoke 的相同代码的快速示例

谢谢

    Dim powershell As PowerShell = PowerShell.Create()
    powershell.AddCommand("Get-Process")

    Dim results = powershell.BeginInvoke

   Do While results.IsCompleted = False

            ' wait whilst command completes

    Loop


    For Each result As PSObject In powershell.EndInvoke(results)

      UpdateTextBox("Process Name: " & result.Members("ProcessName").Value & " Process ID: " & result.Members("Id").Value & vbCrLf)

    Next result

或者

   Dim powershell As PowerShell = PowerShell.Create()
    powershell.AddCommand("Get-Process")

    Dim results = powershell.Invoke


    For Each result As PSObject In results

        UpdateTextBox("Process Name: " & result.Members("ProcessName").Value & " Process ID: " & result.Members("Id").Value & vbCrLf)

    Next result

标签: c#vb.netpowershell

解决方案


如果您在整个应用程序中使用 TPL,请使用InvokeAsync. 您可以等待或不等待呼叫,就像您可以等待任何其他异步方法一样。

如果您需要同步调用,例如您的后台操作必须等待从 UI 获取输入,则使用Invoke.

如果您不需要同步调用,请使用BeginInvoke. 如果您需要取回数据,那么EndInvoke也可以使用。例如,如果您在后台执行操作并更新 a ProgressBar,则应该调用BeginInvoke而不是Invoke. 那是因为当更新发生时,后台工作不需要等待。不过,您不需要任何结果,因此无需调用EndInvoke.


推荐阅读