等待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
上调用Wait
或Result
。 这将导致我在博客上完全解释的死锁 。
总而言之, await
将捕获一个上下文并使用它来恢复async
方法; 在UI应用程序上,这是一个UI线程。 但是,如果UI线程被阻止(在对Wait
或Result
的调用中),则该线程不可用于恢复async
方法。
这对我有用:
httpClient.SendAsync(httpContent).ConfigureAwait(false);
我刚刚删除await
,只是使用如下,它工作:
var result = httpClient.SendAsync(httpContent).Result;
但这不是一个好习惯。 正如Nikola所说,我们不应该混合同步和异步调用。
我将调用方法更改为异步,问题得到解决。