我正在阅读以下主题http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html 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);
}
我知道“await httpResponseMessage.Content.ReadAsAsync().ConfigureAwait(false)”将防止上述代码中的死锁
第一的:
我的查询是“string message = httpResponseMessage.Content.ReadAsStringAsync().Result”行,.Result 会在该行中导致死锁吗?
第二:
如果我像这样从 UI 调用该代码:
public static object DoGet()
{
// Build getObject
var task = Utility.GetAsync(getObject);
task.Wait();
var response = task.Result;
return response;
}
这会导致僵局吗?
请注意,我知道为了避免 async-await 带来的所有混乱,从 UI 到 DAL 的所有方法都必须是 async-await,但我目前无法更改所有结构,我目前的目标是调用HttpClient 库并执行一些 GET 操作。
所以我的问题是上面的代码会导致死锁吗?
Third:
是task.Wait();上面的代码中甚至需要吗?
在一般情况下,您应该假设yes, 呼叫.Result
or .Wait()
on anything可等待是危险的并且可能会死锁(除非您是发出任务的库,并且您了解完整的上下文)。这是possible它在某些特定情况下可以正常工作,但你应该not依赖这种行为,即使它有效today.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)