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;
 }

任何帮助将不胜感激!

UWP 10 C# HttpResponseMessage 任务冻结

它根本没有奇怪的冻结 - 它完全合理地冻结。

您正在调用 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);
}

谢谢!