UWP 10 C#HttpResponseMessage任务冻结

S. *_*ann 0 c# dotnet-httpclient

我从搜索中找不到任何有类似问题的人:

我正在尝试使用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;
 }
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

Jon*_*eet 5

它根本没有结冰 - 它完全冻结了.

您正在调用task.Wait(),这会阻止您的UI线程执行任何更多工作,直到该任务完成.但是,当完成返回的任务时,该任务本身需要返回到UI线程httpClient.PostAsync,以便继续使用其余的异步方法.

基本上,您不应该使用Task.Wait()Task.Result除非您确定任务本身不会被阻止等待继续执行您当前正在执行的线程.

理想情况下,您的register方法(应该Register遵循.NET命名约定)也应该是异步的,因此您可以等待返回的任务MakeRequest.

另外,您可能应该更改MakeRequest等待任务的方式- 因为该方法的其余部分实际上不需要在UI线程上运行,您可以使用:

responseMessage = await httpClient.PostAsync(server, content).ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)

最后,这一行:

responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
Run Code Online (Sandbox Code Playgroud)

... NullReferenceException如果它执行,将抛出一个.如果抛出异常,responseMessage仍将为null.