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