HttpClient.GetAsync永远不会在Xamarin.Android上返回

我正在开发一个Android应用程序,由Azure上托管的ASP.NET Core应用程序提供支持。 在为Xamarin.Forms(仅限Android)项目制作function之前,我正在使用共享库项目来测试控制台应用程序项目的基本内容。
登录到Web服务运行以下代码,其中ClientHttpClient

 public static async Task GetInformationAsync(string accountId) { HttpResponseMessage response = await Client.GetAsync(UriData + "/" + accountId); response.EnsureSuccessStatusCode(); string responseContent = await response.Content.ReadAsStringAsync(); return JsonConvert.DeserializeObject(responseContent); } 

在同一台计算机/网络下,代码在Console应用程序上完成不到一秒钟,然而,它在Xamarin.Forms.Android项目中永远不会完成(甚至等待一分钟)。
我发现这很奇怪,因为Android客户端可以使用PostAsync成功登录到Web服务。

但是,Android客户端和控制台客户端如何调用GetInformationAsync

而Console客户端异步调用它:

  private static async void TestDataDownload() { ... var data = await WebApiClient.GetInformationAsync(myId); } 

Android客户端同步调用它

  public void MainPage() { ... var data = WebApiClient.GetInformationAsync(myId).Result; } 

看起来你遇到了某种僵局。 您可能希望将代码包含在实际调用GetInformationAsync ,因为它可能是问题源所在的位置。

您可以通过以下方式解决问题:

  1. 不以同步方式调用GetInformationAsync
  2. 使用ConfigureAwait(false)将GetInformationAsync中的异步调用GetInformationAsync为不在每个方法调用上切换上下文。

所以你的GetInformationAsync方法看起来像:

 public static async Task GetInformationAsync(string accountId) { var response = await Client.GetAsync(UriData + "/" + accountId).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var responseContent = await response.Content.ReadAsStringAsync().ConfigureAwait(false); return JsonConvert.DeserializeObject(responseContent); } 

然后,如果你在某个地方调用它,你需要它返回相同的上下文,即如果你需要更新UI:

 var myClass = await GetInformationAsync(accountId); // update UI here... 

否则,如果您不需要返回相同的上下文:

 var myClass = await GetInformationAsync(accountId).ConfigureAwait(false);