我正在使用后台线程对Web服务进行异步调用并返回结果。当后台线程正在运行且我的应用程序被取消激活时,假设用户按下主页按钮,我该如何处理它?
private async void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
//What should I do here?
}
我从以下博客http://www.wintellect.com/blogs/jgarland/proceed-with-caution---windows-phone-8-app-lifecycle-events-vs-async-methods了解到,我无法等待,直到后台线程在停用的方法中完成。同时它建议使用同步调用。如果我必须在取消激活的事件中取消我的后台线程,如何做我发现当前正在运行哪个后台线程?在每个调用Web服务的页面中,都使用了后台线程。有没有办法在应用程序再次激活后恢复后台线程?
答案 0 :(得分:4)
你是对的,当你的应用程序被停用时,所有进程都会停止 - MSDN source:
当用户远离应用程序向前导航时,在引发Deactivated事件后,操作系统将尝试将应用程序置于休眠状态。在此状态下,所有应用程序的线程都将停止,并且不会进行任何处理,但应用程序在内存中保持不变。
在停用的事件中,您应调用对所有后台线程的取消请求。如果您使用的是aync-await,那么您可以使用CancellationTokenSource来配置这些方法。以下是有关此内容的更多信息:Enabling Progress and Cancellation in Async,Cancel an Async Task or a List of Tasks ,您可以在Stephen Cleary blog上找到大量信息。
至于知道哪个Task正在运行的问题,我认为你可以使用这个CancellationTokenSource来检查它 - 如果它不是null那么这意味着你的bacground线程正在工作。
至于重新启动方法 - 一切都取决于你的代码和方法执行的内容。如果您正在下载一组文件,那么您可以记住下载了哪些文件,并在激活调用方法后下载其余文件。如果您执行某些计算,那么您可以记住方法停止的位置并尝试继续进一步计算。以为它有时候很难。你必须记住你有limited time to 10 seconds:
您不应该等到Deactivated事件发生以存储此数据。请记住,所有应用程序生命周期事件都会强制应用程序完成任何任务的时间限制为10秒。
关于其他可能性:
如果您想在后台处理中执行某些操作,那么如果您要下载文件,则可以使用Background agents和Background transfers。还有背景音频,但我想你不是在询问它。
如果您希望自己的应用在锁定屏幕启用时保持在前台,那么您可以Deactivate Idle Detection。