在PowerShell中获取.Net对象异步方法的结果

gui*_*e31 14 powershell async-await

我试图在Powershell中实例化的.Net对象上调用异步方法:

Add-Type -Path 'my.dll'

$myobj = new-object mynamespace.MyObj()

$res = $myobj.MyAsyncMethod("arg").Result

Write-Host "Result : " $res
Run Code Online (Sandbox Code Playgroud)

执行脚本时,shell似乎不会等待MyAsyncMethod().Result并且什么也不显示,尽管检查返回值表明它是正确的类型(Task<T>).各种其他尝试,例如中间变量Wait()等,没有给出任何结果.

我在网上找到的大部分内容都是从C#异步调用Powershell脚本.我想反过来,但似乎没有人对此感兴趣.这是否可能,如果没有,为什么?

Mik*_*tly 11

我知道这是一个非常古老的线程,但可能是你实际上从异步方法中得到了一个错误但是因为你正在使用它而被吞噬了.Result.

尝试使用.GetAwaiter().GetResult()而不是,.Result这将导致任何异常被冒泡.


Tah*_*san 5

对于长时间运行的方法,请使用该PSRunspacedDelegate模块,这将使您能够异步运行任务:

$task = $myobj.MyAsyncMethod("arg");
$continuation = New-RunspacedDelegate ( [Action[System.Threading.Tasks.Task[object]]] { 
    param($t)

    # do something with $t.Result here
} );

$task.ContinueWith($continuation);
Run Code Online (Sandbox Code Playgroud)

请参阅GitHub 上的文档。(免责声明:我写的)。


Wha*_*ool 3

这对我有用。

Add-Type -AssemblyName 'System.Net.Http'

$myobj = new-object System.Net.Http.HttpClient

$res = $myobj.GetStringAsync("https://google.com").Result

Write-Host "Result : " $res
Run Code Online (Sandbox Code Playgroud)

也许检查 PowerShell 是否配置为使用 .NET 4:

如何使用 .NET 4 运行时运行 PowerShell?