我的应用程序通过异步调用apis从服务器检索数据。只要用户仍在应用程序中,它就可以正常工作。 实施快速应用程序恢复后,当应用程序在单击磁贴后恢复时,控件将进入用户之前离开的页面。
如果在用户取消激活应用程序时运行了任何异步调用(之前点击了启动按钮),则会抛出以下异常。。
实际上,以下代码抛出了此异常。
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 方法上执行异步方法?或者有没有办法保留异步调用的状态并再次恢复它?
提前致谢。
答案 0 :(得分:1)
当您的应用停用时,其所有过程都会停止(MSDN):
当用户远离应用程序向前导航时,在引发Deactivated事件后,操作系统将尝试将应用程序置于休眠状态。在此状态下,所有应用程序的线程都将停止,并且不会进行任何处理,但应用程序在内存中保持不变。
您的异步方法应该允许取消 - here you have an example of Cancelling。
使用CancellationTokenSource然后在您的停用事件或OnNavigatedFrom中放置:
if (cts != null) cts.Cancel();
在您的情况下,您还应该从response
实现AsyncReading(通过缓冲区)以启用token.ThrowIfCancealltionRequested()
。您可以查看here - method 3和here。也许它会有所帮助。