3

当应用程序进入后台然后恢复时,等待的任务会发生什么?假设收到有关应用程序挂起的事件时未取消任务。从墓碑状态恢复和仅从背景恢复有什么区别吗?

如果没有直接答案,即这取决于提供异步 API 的服务的实现,那么在这种情况下要遵循的最佳实践是什么?

4

1 回答 1

4

当应用程序进入后台时,应用程序的所有线程都被冻结。因此,一旦应用程序被激活,任务就会恢复。

例如,让我们运行这个代码片段:

    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 的最佳实践而言:

  1. 对于使用外部资源(例如 WebRequest)的任何操作,最好在其周围放置一个 try-catch 块,并进行一些有意义的错误处理。更多 @ http://msdn.microsoft.com/en-us/library/dd997415.aspx

  2. 对于在应用程序停用后停止的长时间运行的任务,请使用 TaskCancellationToken 机制来取消这些任务。更多 @ http://msdn.microsoft.com/en-us/library/dd997396.aspx

于 2013-01-28T18:55:36.250 回答