加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 19:27:33 所属栏目:百科 来源:网络整理
导读:我正在开发一个 Android应用程序,由Azure上托管的ASP.NET Core应用程序提供支持.我在使用Xamarin.Forms(仅限Android)项目的功能之前,正在使用共享库项目来测试控制台应用程序项目的基本内容. 登录到Web服务后运行以下代码,其中Client是HttpClient: public s
我正在开发一个 Android应用程序,由Azure上托管的ASP.NET Core应用程序提供支持.我在使用Xamarin.Forms(仅限Android)项目的功能之前,正在使用共享库项目来测试控制台应用程序项目的基本内容.
登录到Web服务后运行以下代码,其中Client是HttpClient:

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

在同一台计算机/网络下,代码在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的位置,因为它可能是问题源所在的位置.

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

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

所以你的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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读