gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:44 24 4
gpt4 key购买 nike

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

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

在同一台计算机/网络下,代码在控制台应用程序中不到一秒即可完成,但是,它在 Xamarin.Forms.Android 项目中从未完成(甚至等待一分钟)。
我觉得这很奇怪,因为 Android 客户端可以使用 PostAsync 成功登录到 Web 服务。

但是,Android 客户端和控制台客户端调用 GetInformationAsync 的方式有所不同。

当控制台客户端异步调用它时:

 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. GetInformationAsync 中使用 ConfigureAwait(false) 后缀您的异步调用,以便在每个方法调用时不切换上下文。

因此您的 GetInformationAsync 方法将如下所示:

public static async Task<MyClass> 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<MyClass>(responseContent);
}

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

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

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

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

关于c# - HttpClient.GetAsync 永远不会在 Xamarin.Android 上返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38088542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com