アプリケーションがバックグラウンドに移行して再開すると、待機中のタスクはどうなりますか?アプリケーションの一時停止に関するイベントを受信したときに、タスクがキャンセルされなかったと想定します。トゥームストーン状態からの再開とバックグラウンドからの再開に違いはありますか?
直接的な答えがない場合、つまり非同期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");
}
このコードスニペットを実行し、5秒が経過する前に[スタート]ボタンを押すと、次の出力が表示されます。
Application_Launching
始めました
Application_Deactivate
Application_Activated
私はこれで終わりです
上記のイベントシーケンスに基づいて、非アクティブ化とアクティブ化の後にasync-awaitタスクが完了することがわかります。
async-awaitのベストプラクティスに関して:
外部リソース(WebRequestなど)を使用する操作の場合、意味のあるエラー処理を備えたtry-catchブロックをその周りに配置するのが最善です。詳細@http ://msdn.microsoft.com/en-us/library/dd997415.aspx
アプリが非アクティブ化されたら停止するのが理にかなっている長時間実行タスクの場合は、TaskCancellationTokenメカニズムを使用してそれらのタスクをキャンセルします。詳細@http ://msdn.microsoft.com/en-us/library/dd997396.aspx