PowerShell中异步方法的使用

问题

PowerShell脚本中有个文件上传功能,使用HttpClient
脱敏处理后基本就是这样子

$client = new-object System.Net.Http.HttpClient;
$result = $client.PostAsync($URL,@{}).Result;

别问为什么不用await,问就是有原因

某天程序执行后,$result始终为空,也无异常
经过艰苦卓绝的排查后发现$URL存在证书问题。

同样的程序,使用C#写就会抛出异常

所以,这算是个PowerShell使用.NET的一个坑

怎么写

方案一
$client = new-object System.Net.Http.HttpClient;
$result = $client.PostAsync($URL,@{}).GetAwaiter().GetResult();

至于Task.Result与Task.GetAwaiter().GetResult(),二者都不推荐使用,但是非要矮子里拔高个,推荐使用后者(刚说了,在PowerShell中,前者压根就不抛出异常)

方案二
$client = new-object System.Net.Http.HttpClient;
$task = $client.PostAsync($URL,@{});
$result = $task.Result
if(-not $result)
{
    throw $task.Exception
}

Ref

https://stackoverflow.com/questions/17284517/is-task-result-the-same-as-getawaiter-getresult

posted @ 2022-09-08 22:38  talentzemin  阅读(266)  评论(0编辑  收藏  举报