【问题标题】:Call external api from Web API synchronously从 Web API 同步调用外部 api
【发布时间】:2015-02-16 22:30:08
【问题描述】:
【问题讨论】:
标签:
c#
web-services
asynchronous
asp.net-web-api
async-await
【解决方案1】:
阻止async 操作可能很危险。它会损害性能并可能导致死锁(更多内容请参见 Should I expose synchronous wrappers for asynchronous methods?)
但是,如果您确定这是您想要做的,IMO 最好使用GetAwaiter().GetResult():
using (HttpClient httpClient = new HttpClient())
{
var response = httpClient.GetAsync(_endpoint).GetAwaiter().GetResult();
var result = response.Content.ReadAsStringAsync().GetAwaiter().GetResult();
// Do stuff...
}
无论是Task 还是Task<T>,都是一样的,await 转换为相同的调用(尽管await 任务已经完成)并且Task.Result(或Task.Wait)包含任何异常在AggregateException 中,而GetAwaiter().GetResult() 只抛出第一个Exception,就像await 一样。