我无法从搜索中找到任何有类似问题的人:
我正在尝试使用HttpClient从服务器获取XML,但我的UI在“task.Wait()”行奇怪地冻结。这是代码:
public void register() {
String data = "register=" + (accountName) + "&email0=" +
(email) + "&email1=" + (otherEmail);
var task = MakeRequest(data);
task.Wait(); //freezes here
var response = task.Result;
String resultstring = response.Content.ReadAsStringAsync().Result;
}
private static async Task<System.Net.Http.HttpResponseMessage> MakeRequest(String data)
{
var content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded");
var httpClient = new System.Net.Http.HttpClient();
System.Net.Http.HttpResponseMessage responseMessage=null;
try
{
responseMessage = await httpClient.PostAsync(server, content);
}
catch(Exception ex)
{
responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
}
return responseMessage;
}
非常感谢任何帮助!
答案 0 :(得分:5)
它根本没有奇怪的冻结 - 它完全冻结了。
您正在调用task.Wait()
,这会阻止您的UI线程完成任务,直到该任务完成。但是,当httpClient.PostAsync
返回的任务完成时,该任务本身需要返回到UI线程,以便继续使用其余的异步方法。
基本上,您不应该使用Task.Wait()
或Task.Result
,除非您确定确定该任务本身不会被阻止等待您继续使用该主题目前正在执行。
理想情况下,您的register
方法(应该Register
遵循.NET命名约定)也应该是异步的,因此您可以等待MakeRequest
返回的任务。
此外,您应该更改MakeRequest
等待任务的方式 - 因为该方法的其余部分确实需要在UI线程上运行,您可以使用:< / p>
responseMessage = await httpClient.PostAsync(server, content).ConfigureAwait(false);
最后,这一行:
responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
...如果它执行,将抛出NullReferenceException
。如果抛出异常,responseMessage
仍为空。
答案 1 :(得分:0)
Jon Skeet的回答解决了我的问题,如果其他初学者遇到同样的问题,这是工作代码。
public async void Register{
String data = "register=" + (accountName) + "&email0=" +
(email) + "&email1=" + (otherEmail);
var task = await MakeRequest(data);
String resultstring = taskContent.ReadAsStringAsync().Result;
}
private static async Task<System.Net.Http.HttpResponseMessage> MakeRequest(String data)
{
var content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded");
var httpClient = new System.Net.Http.HttpClient();
return await httpClient.PostAsync(server, content).ConfigureAwait(false);
}
非常感谢!