来自Web UI的死锁.Result

时间:2017-03-13 09:01:58

标签: c# asp.net .net async-await

我正在阅读以下主题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();甚至在上面的代码中需要?

1 个答案:

答案 0 :(得分:6)

在一般情况下,你应该假设,在上调用.Result.Wait()等待是危险的并且可能会死锁(除非您是发布任务的库,并且您了解完整的上下文。 可能它在某些特定情况下可以正常工作,但是依赖于该行为,即使它今天 。< / p>