首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GetAsync :不返回HttpResponseMessage

GetAsync :不返回HttpResponseMessage
EN

Stack Overflow用户
提问于 2016-03-16 10:52:56
回答 1查看 3.7K关注 0票数 2

应用程序应该接收来自LoginUser()的LoginUser,但它没有响应。

代码语言:javascript
复制
    private void button1_Click(object sender, EventArgs e)
    {
        if (LoginUser(tUser.Text, Password.Text).Result.IsSuccessStatusCode)
        {
            Notifier.Notify("Successfully logged in.. Please wait!");

        }
        else
        {
            Notifier.Notify("Please check your Credential..");
        }            
    }
代码语言:javascript
复制
    public async Task<HttpResponseMessage> LoginUser(string userid, string password)
    {
        string URI = "http://api.danubeco.com/api/userapps/authenticate";

        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("c291cmF2OmtheWFs");

            using (var response = await client.GetAsync(String.Format("{0}/{1}/{2}", URI, userid, password)))
            {
                return response;
            }
        }
    }

请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-16 11:11:16

您正在阻塞UI线程并导致死锁。从斯蒂芬·克利里的博客 (只需用LoginUser方法替换GetJsonAsync,用client.GetAsync替换GetStringAsync ):

这就是所发生的事情,首先是顶层方法(Button1_Click表示UI / MyController.Get表示ASP.NET):

  1. 顶层方法调用GetJsonAsync (在UI/ASP.NET上下文中)。
  2. GetJsonAsync通过调用HttpClient.GetStringAsync (仍然在上下文中)启动REST请求。
  3. GetStringAsync返回一个未完成的任务,指示REST请求未完成。
  4. GetJsonAsync正在等待GetStringAsync返回的任务。该上下文将被捕获,并将用于稍后继续运行GetJsonAsync方法。GetJsonAsync返回一个未完成的任务,指示GetJsonAsync方法未完成。
  5. 顶层方法同步阻塞由GetJsonAsync返回的任务。这会阻塞上下文线程。
  6. …最终,其余的请求将完成。这样就完成了GetStringAsync返回的任务。
  7. GetJsonAsync的延续现在已经准备好运行,它等待上下文可用,以便在上下文中执行。
  8. 死锁。顶层方法阻塞上下文线程,等待GetJsonAsync完成,而GetJsonAsync则等待上下文空闲以便它能够完成。

以及简单的可用解决方案(也来自博客):

  1. 在“库”异步方法中,尽可能使用ConfigureAwait(false)。
  2. 不要阻止任务,要一直使用异步。

第二个解决方案建议将button1_Click更改为:

代码语言:javascript
复制
private async void button1_Click(object sender, EventArgs e)
{
    if ((await LoginUser(tUser.Text, Password.Text)).IsSuccessStatusCode)
    {
        Notifier.Notify("Successfully logged in.. Please wait!");

    }
    else
    {
        Notifier.Notify("Please check your Credential..");
    }            
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36033532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档