我尝试在Powershell中实例化的.Net对象上调用异步方法:
Add-Type -Path 'my.dll'
$myobj = new-object mynamespace.MyObj()
$res = $myobj.MyAsyncMethod("arg").Result
Write-Host "Result : " $res
在执行脚本时,尽管检查返回值表明它是正确的类型(Task<T>
),但shell似乎不等待MyAsyncMethod().Result
,也不显示任何内容。其他各种尝试,如中间变量、Wait()
等,都没有结果。
我在网上找到的大多数东西都是关于从C#异步调用Powershell脚本的。我想反其道而行之,但似乎没有人有兴趣这样做。这是可能的吗?如果不可能,为什么?
发布于 2016-09-01 10:50:45
我知道这是一个非常老的线程,但它可能是你实际上从异步方法中得到了一个错误,但它被吞噬了,因为你正在使用.Result
。
尝试使用.GetAwaiter().GetResult()
而不是.Result
,这将导致出现任何异常。
发布于 2017-11-03 12:16:28
对于长时间运行的方法,请使用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);
参见documentation on GitHub。(免责声明:我写的)。
发布于 2014-10-18 23:11:54
这对我很有效。
Add-Type -AssemblyName 'System.Net.Http'
$myobj = new-object System.Net.Http.HttpClient
$res = $myobj.GetStringAsync("https://google.com").Result
Write-Host "Result : " $res
也许可以检查一下是否将PowerShell配置为使用.NET 4:
https://stackoverflow.com/questions/25851704
复制