c# - 调用、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
解决方案
如果您在整个应用程序中使用 TPL,请使用InvokeAsync
. 您可以等待或不等待呼叫,就像您可以等待任何其他异步方法一样。
如果您需要同步调用,例如您的后台操作必须等待从 UI 获取输入,则使用Invoke
.
如果您不需要同步调用,请使用BeginInvoke
. 如果您需要取回数据,那么EndInvoke
也可以使用。例如,如果您在后台执行操作并更新 a ProgressBar
,则应该调用BeginInvoke
而不是Invoke
. 那是因为当更新发生时,后台工作不需要等待。不过,您不需要任何结果,因此无需调用EndInvoke
.
推荐阅读
- python - 如何解决:float() 参数可以是字符串或数字,而不是“地图”
- file-io - Fortran read 语句读取序列
- javascript - 如何在没有 routerLink Click 的情况下添加 queryParams?
- php - 如何解决在php的嵌套foreach循环中重置变量
- javascript - v-for 循环中给出错误的动态引用不会出现在 DOM 中。**提供的元素不在文档中**
- angular-cli-v7 - 如何将 angular-cli.json 转换为 angular.json
- typescript - react-router-native 目前没有启用对实验性语法“classProperties”的支持?
- c - MKL 矩阵转置
- mysql - 使用 2 个组标准选择或更新 mysql 上的最大值
- delphi - 无法在 delphi 中使用 ShellExecute 在文本文件中写入可用的性能计数器