我正在阅读以下主题http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
并决定在我的库中编写一个通用的实用工具方法,通过HTTPClient在远程URL上进行GET
public static async Task<T> GetAsync<T>(HttpGetObject getObject)
{
string baseUrl = getObject.BaseUrl;
string actionUrl = getObject.ActionRelativeUrl;
string acceptType = getObject.AcceptType;
using (var client = new HttpClient())
{
client.BaseAddress = new Uri(baseUrl);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(acceptType));
AddCustomHeadersToHttpClient(client, getObject);
// HTTP GET
HttpResponseMessage httpResponseMessage = await client.GetAsync(actionUrl).ConfigureAwait(false);
if (httpResponseMessage.IsSuccessStatusCode)
{
T response = await httpResponseMessage.Content.ReadAsAsync<T>().ConfigureAwait(false);
return response;
}
else
{
string message = httpResponseMessage.Content.ReadAsStringAsync().Result;
throw new Exception(message);
}
}
return default(T);
}
我知道&#34;等待httpResponseMessage.Content.ReadAsAsync()。ConfigureAwait(false)&#34;将阻止上述代码中的死锁 第一: 我的查询是针对&#34; string message = httpResponseMessage.Content.ReadAsStringAsync()。结果&#34; line,will .Result会导致死锁还是不行?
第二: 如果我从这样的UI调用该代码:
public static object DoGet()
{
// Build getObject
var task = Utility.GetAsync(getObject);
task.Wait();
var response = task.Result;
return response;
}
这会导致僵局吗?
请注意我知道要避免乱七八糟的混乱,从UI到DAL的所有方法必须是异步等待但是我现在不能改变所有结构,我此刻的目标是调用HttpClient库并进行一些GET操作。
所以我的问题是,上面的代码会导致死锁吗?
第三
是task.Wait();甚至在上面的代码中需要?
答案 0 :(得分:6)
在一般情况下,你应该假设是,在上调用.Result
或.Wait()
等待是危险的并且可能会死锁(除非您是发布任务的库,并且您了解完整的上下文。 可能它在某些特定情况下可以正常工作,但是不依赖于该行为,即使它今天 。< / p>