[英]Asynchronous Methods in Wp8 app
我的应用程序通过对api的异步调用从服务器检索数据。 只要用户仍在应用程序中,它就可以正常工作。 实施Fast App Resume之后,单击磁贴后,如果应用程序恢复运行,控件将进入用户先前离开的页面。
如果在用户取消激活应用程序时有任何异步调用在运行(先前单击开始按钮),它将引发以下异常。 。
实际上,以下代码引发了此异常。
private async Task<string> httpRequest(HttpWebRequest request)
{
string received;
using (var response = (HttpWebResponse)(await Task<WebResponse>.Factory
.FromAsync(request.BeginGetResponse, request.EndGetResponse, null)))
{
using (var responseStream = response.GetResponseStream())
{
using (var sr = new StreamReader(responseStream))
{
//cookieJar = request.CookieContainer;
//responseCookies = response.Cookies;
received = await sr.ReadToEndAsync();
}
}
}
return received.Replace("[{}]", "[]")
.Replace("[{},{}]", "[]")
.Replace("\"subcat_id\":\"\"", "\"subcat_id\":\"0\"");
}
用户停用应用程序时,有什么方法可以停止在OnNavigatedFrom方法上执行异步方法? 还是有什么方法可以保留异步调用的状态并再次恢复?
提前致谢。
当您的应用程序被停用时,其所有过程都将停止( MSDN ):
当用户在引发Deactivated事件后远离应用程序向前导航时,操作系统将尝试将应用程序置于休眠状态。 在这种状态下,所有应用程序线程都将停止并且不进行任何处理,但是应用程序在内存中保持不变。
您的异步方法应允许“取消”- 这里有一个“取消”的示例 。
使用CancellationTokenSource ,然后在您的Deactivation事件或OnNavigatedFrom中放置:
if (cts != null) cts.Cancel();
在您的情况下,您还应该从response
实现AsyncReading(通过缓冲区)以启用token.ThrowIfCancealltionRequested()
。 您可以在此处查看方法3和此处 。 也许会有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.