来自Web UI的死锁.Result
我正在阅读以下主题http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
并决定在我的库中编写一个通用的实用方法,通过HTTPClient对远程URL进行GET
public static async Task GetAsync(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().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()。结果”行,将。结果是否会导致该行死锁?
第二:如果我从UI调用这样的代码:
public static object DoGet() { // Build getObject var task = Utility.GetAsync(getObject); task.Wait(); var response = task.Result; return response; }
这会导致僵局吗?
请注意我知道要避免乱七八糟的混乱,从UI到DAL的所有方法都必须是async-await但是我现在不能改变所有结构,我此刻的目标是调用HttpClient库并做一些GET操作。
所以我的问题是上面的代码会导致死锁吗?
第三:
是task.Wait(); 甚至在上面的代码中需要?
在一般情况下,您应该假设是 ,在任何 .Wait()
东西上调用.Result
或.Wait .Wait()
是危险的并且可以死锁(除非您是发布任务的库,并且您了解完整的上下文)。 在某些特定情况下,它可能会正常工作,但您不应该依赖该行为,即使它今天有效 。