【问题标题】:await httpClient.SendAsync(httpContent) is non responsive等待 httpClient.SendAsync(httpContent) 没有响应
【发布时间】:2013-11-11 08:03:31
【问题描述】:

await httpClient.SendAsync(httpContent) 没有响应,尽管我发现代码/url 中没有错误,但它仍然挂起。请建议/帮助。

我的代码如下:

public async Task<string> Get_API_Result_String(string url, List<KeyValuePair<string, string>> parameters)
{
    string res = "";

    try
    {
        IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

        //Prepare url
        Uri mainurl = new Uri(settings[FSAPARAM.UserSettingsParam.SERVERNAME].ToString());
        Uri requesturl = new Uri(mainurl, url);

        var httpClient = new HttpClient();
        var httpContent = new HttpRequestMessage(HttpMethod.Post, requesturl);
        // httpContent.Headers.ExpectContinue = false;

        httpContent.Content = new FormUrlEncodedContent(parameters);

        HttpResponseMessage response = await httpClient.SendAsync(httpContent);

        var result = await response.Content.ReadAsStringAsync();
        res = result.ToString();

        response.Dispose();
        httpClient.Dispose();
        httpContent.Dispose();
    }
    catch (Exception ex)
    {
        Logger l = new Logger();
        l.LogInfo("Get_API_Result_String: "+ url + ex.Message.ToString());
        ex = null;
        l = null;
    }

    return res;
}

在另一个类中调用如下:

NetUtil u = new NetUtil();
string result = await u.Get_API_Result_String(Register_API, values);
u = null;

【问题讨论】:

    标签: c# windows-phone


    【解决方案1】:

    在返回压缩的 gzip 数据时遇到了这个错误。这是一种非常罕见的情况,因为 99% 的时间使用不同的输入数据一切都很好。不得不切换到 HttpWebRequest。

    【讨论】:

      【解决方案2】:

      我的没问题

        var response = httpClient.SendAsync(request);
        var responseResult = response.Result;
      
        if (responseResult.IsSuccessStatusCode)
        {
               var result = responseResult.Content.ReadAsStringAsync().Result;
               return result;
        }
      

      【讨论】:

        【解决方案3】:

        我刚刚删除了await,并按如下方式使用,它起作用了:

        var result = httpClient.SendAsync(httpContent).Result;
        

        但这不是一个好习惯。 作为 Nikola 提到,我们不应该混合同步和异步调用。
        我将调用方法更改为异步,问题得到解决。

        【讨论】:

        • 添加了 IsSuccessStatusCode 检查
        【解决方案4】:

        这对我有用:

        httpClient.SendAsync(httpContent).ConfigureAwait(false);
        

        【讨论】:

        • 使用这种做法是否被认为是“不好的做法”?
        【解决方案5】:

        我预测,在您的调用堆栈中,您将在返回的Task 上调用WaitResultThis will cause a deadlock 我在我的博客上详细解释过。

        总而言之,await 将捕获一个上下文并使用它来恢复 async 方法;在 UI 应用程序上,这是一个 UI 线程。但是,如果 UI 线程被阻塞(在对 WaitResult 的调用中),则该线程无法恢复 async 方法。

        【讨论】:

        • 是的,我查过了。我用 await 调用每个上层方法。
        • 我试图在 testApp 中放置完全相同的场景,它工作正常。 ny 当前项目有很多代码,所以我在各处仔细追踪以找到死锁。谢谢
        • 我在 Application_Launching 中使用了异步,因为我必须在 Application_Launching 中调用异步方法,我认为这是造成问题。你能帮忙吗?
        猜你喜欢
        • 2022-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-30
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多