HttpClient.GetAsync永远不会在Xamarin.Android上返回
我正在开发一个Android应用程序,由Azure上托管的ASP.NET Core应用程序提供支持。 在为Xamarin.Forms(仅限Android)项目制作function之前,我正在使用共享库项目来测试控制台应用程序项目的基本内容。
登录到Web服务后运行以下代码,其中Client
是HttpClient
:
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
,因为它可能是问题源所在的位置。
您可以通过以下方式解决问题:
- 不以同步方式调用
GetInformationAsync
- 使用
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);
- 来自SQLite Database C#Android的Xamarin ListView显示项
- 如何从Unity中的代码安装Android apk
- 无法在Xamarin.Forms Visual Studio 2015中加载memtrack(无此类文件或目录)错误
- ARCore for Unity保存相机图像
- Android TextView defStyle参数被忽略了吗?
- C#Xamarin Android无法获得ID
- Unity的安装数据库(SQLite)
- 用于Animate TopMargin的ObjectAnimator代理无法找到设置/获取
- MonoDroid:从Web服务读取大型json字符串时间歇性失败