C# Wp8应用程序中的异步方法

C# Wp8应用程序中的异步方法,c#,asynchronous,windows-phone-8,C#,Asynchronous,Windows Phone 8,我的应用程序通过异步调用API从服务器检索数据。只要用户仍在应用程序中,它就可以正常工作。 在执行快速应用程序恢复后,当应用程序在单击互动程序后恢复时,控件将转到用户先前离开的页面 如果在用户停用应用程序(之前点击开始按钮)时有任何异步调用正在运行,则会引发以下异常 事实上,此异常是由以下代码引发的 private async Task<string> httpRequest(HttpWebRequest request) { string recei

我的应用程序通过异步调用API从服务器检索数据。只要用户仍在应用程序中,它就可以正常工作。 在执行快速应用程序恢复后,当应用程序在单击互动程序后恢复时,控件将转到用户先前离开的页面

如果在用户停用应用程序(之前点击开始按钮)时有任何异步调用正在运行,则会引发以下异常

事实上,此异常是由以下代码引发的

    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\"");
    } 
专用异步任务httpRequest(HttpWebRequest)
{
收到字符串;
使用(var response=(HttpWebResponse)(wait Task.Factory
.FromAsync(request.BeginGetResponse,request.EndGetResponse,null)))
{
使用(var responseStream=response.GetResponseStream())
{
使用(var sr=新的StreamReader(responseStream))
{
//cookieJar=request.CookieContainer;
//responseCookies=response.Cookies;
已接收=等待sr.ReadToEndAsync();
}
}
}
已收到返回。替换(“[{}]”,“[]”)
.Replace(“[{},{}]”,“[]”)
.Replace(“\”子类别id\”:\”,“\”子类别id\”:“0\”);
} 
当用户停用应用程序时,是否有任何方法可以停止在OnNavigatedFrom方法上执行async方法?或者有没有办法保留异步调用的状态并再次恢复


提前感谢。

当您的应用程序被停用时,其所有进程都将停止():

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

您的异步方法应该允许取消-

然后在停用事件或OnNavigatedFrom put中使用和:

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

在您的情况下,还应该从
response
实现异步读取(通过缓冲区),以启用
token.throwifcanceallionrequested()
。你可以看看,看看。可能会有帮助。

感谢您的快速响应,我有两个问题,一个是我在重写的方法onNavigatedTo()中加载初始数据,仅当(e.NavigationMode==NavigationMode.New)。我的错误,请让我知道我们应该从服务器加载哪些事件的数据。页面加载每次都会发生,即使我们导航回来,等等。我只是第一次想要数据。第二件事是,在我的应用程序中,我有大约20个页面,我的客户要求实现应用程序恢复,所以我需要任何耗时较短的解决方案。@LojiSmithKaleem对于第一个问题,你几乎没有可能。IMO在应用程序启动时加载数据(您的时间有限)不是一个好主意,因此OnNavigatedTo可能是一个好主意,我只提供一些指标(数据正在下载),您可以轻松提供一个布尔值,该布尔值将在数据已下载时提供信息,然后在停用后,您可以检查它。@LojiSmithKaleem我认为有很多好的解决方案,这也取决于您特定的应用程序用途和生命周期。我只想补充一点,您还应该阅读/实现关于逻辑删除的案例,在大多数情况下,您必须再次加载数据。好的,逻辑删除是否适用于异步调用?目前,我只是捕获异常并忽略它,然后再次发送呼叫,它就工作了。例如,如果用户停用应用程序,则在加载评论时,当用户返回时,loadReviews()方法将捕获异常,如果(webEx.Status==System.Net.WebExceptionStatus.requestcancelled)忽略,则显示错误消息。在OnNavigatedTo中,我再次调用loadReviews(),它正在工作。例如,这是一个可行的解决方案吗?或者维护状态也可以解决异步问题?