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