繁体   English   中英

Wp8应用中的异步方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM