等待httpClient.SendAsync(httpContent)无响应

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

我的代码如下:

 public async Task Get_API_Result_String(string url, List<KeyValuePair> 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; 

我预测你的调用堆栈会更进一步,你在返回的Task上调用WaitResult 。 这将导致我在博客上完全解释的死锁 。

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

这对我有用:

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

我刚刚删除await ,只是使用如下,它工作:

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

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