我正在开发一个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);
总结 以上是内存溢出为你收集整理的c# – HttpClient.GetAsync永远不会在Xamarin.Android上返回全部内容,希望文章能够帮你解决c# – HttpClient.GetAsync永远不会在Xamarin.Android上返回所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)