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客户端和控制台客户端如何调用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 所以你的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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |