当应用程序进入后台然后恢复时,等待的任务会发生什么?假设收到有关应用程序挂起的事件时未取消任务。从墓碑状态恢复和仅从背景恢复有什么区别吗?
如果没有直接答案,即这取决于提供异步 API 的服务的实现,那么在这种情况下要遵循的最佳实践是什么?
当应用程序进入后台然后恢复时,等待的任务会发生什么?假设收到有关应用程序挂起的事件时未取消任务。从墓碑状态恢复和仅从背景恢复有什么区别吗?
如果没有直接答案,即这取决于提供异步 API 的服务的实现,那么在这种情况下要遵循的最佳实践是什么?
当应用程序进入后台时,应用程序的所有线程都被冻结。因此,一旦应用程序被激活,任务就会恢复。
例如,让我们运行这个代码片段:
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
Debug.WriteLine("I've started");
await Task.Delay(TimeSpan.FromSeconds(5));
Debug.WriteLine("I'm done");
}
private void Application_Launching(object sender, LaunchingEventArgs e)
{
Debug.WriteLine("Application_Launching");
}
private void Application_Activated(object sender, ActivatedEventArgs e)
{
Debug.WriteLine("Application_Activated");
}
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
Debug.WriteLine("Application_Deactivated");
}
当我们运行此代码片段并在五秒结束前点击“开始”按钮时,我们可以看到以下输出:
应用程序_启动
我已经开始了
应用程序_停用
应用程序_已激活
我受够了
根据上述事件序列,您可以看到异步等待任务在停用和激活后完成。
就 async-await 的最佳实践而言:
对于使用外部资源(例如 WebRequest)的任何操作,最好在其周围放置一个 try-catch 块,并进行一些有意义的错误处理。更多 @ http://msdn.microsoft.com/en-us/library/dd997415.aspx
对于在应用程序停用后停止的长时间运行的任务,请使用 TaskCancellationToken 机制来取消这些任务。更多 @ http://msdn.microsoft.com/en-us/library/dd997396.aspx