UWP 10 C# HttpResponseMessage 任务冻结
本文关键字:任务 冻结 HttpResponseMessage UWP | 更新日期: 2023-09-27 18:35:23
我无法从搜索中找到有类似问题的人,因此:
我正在尝试使用 HttpClient 从服务器获取 XML,但我的 UI 在"任务"行奇怪地冻结。等待()"。这是代码:
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;
}
任何帮助将不胜感激!
它根本没有奇怪的冻结 - 它完全合理地冻结。
您正在调用 task.Wait()
,这会阻止您的 UI 线程执行更多工作,直到该任务完成。但是,当 httpClient.PostAsync
返回的任务完成时,该任务本身需要返回到 UI 线程,以便继续执行异步方法的其余部分。
基本上,您不应该使用 Task.Wait()
或 Task.Result
,除非您确定任务本身不会被阻止等待您当前正在执行的线程继续。
理想情况下,您的register
方法(应Register
遵循 .NET 命名约定)也应该是异步的,因此您可以等待 MakeRequest
返回的任务。
此外,您可能应该更改MakeRequest
等待任务的方式 - 因为该方法的其余部分实际上不需要在 UI 线程上运行,因此您可以使用:
responseMessage = await httpClient.PostAsync(server, content).ConfigureAwait(false);
最后,这一行:
responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
。如果执行,将抛出NullReferenceException
。如果引发异常,responseMessage
仍将为 null。
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);
}
谢谢!