Wp8应用程序中的异步方法

时间:2014-03-24 08:41:55

标签: c# asynchronous windows-phone-8

我的应用程序通过异步调用apis从服务器检索数据。只要用户仍在应用程序中,它就可以正常工作。 实施快速应用程序恢复后,当应用程序在单击磁贴后恢复时,控件将进入用户之前离开的页面。

如果在用户取消激活应用程序时运行了任何异步调用(之前点击了启动按钮),则会抛出以下异常。Exception

实际上,以下代码抛出了此异常。

    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 方法上执行异步方法?或者有没有办法保留异步调用的状态并再次恢复它?

提前致谢。

1 个答案:

答案 0 :(得分:1)

当您的应用停用时,其所有过程都会停止(MSDN):

  

当用户远离应用程序向前导航时,在引发Deactivated事件后,操作系统将尝试将应用程序置于休眠状态。在此状态下,所有应用程序的线程都将停止,并且不会进行任何处理,但应用程序在内存中保持不变。

您的异步方法应该允许取消 - here you have an example of Cancelling

使用CancellationTokenSource然后在您的停用事件或OnNavigatedFrom中放置:

if (cts != null) cts.Cancel();

在您的情况下,您还应该从response实现AsyncReading(通过缓冲区)以启用token.ThrowIfCancealltionRequested()。您可以查看here - method 3here。也许它会有所帮助。