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");
    }

このコードスニペットを実行し、5秒が経過する前に[スタート]ボタンを押すと、次の出力が表示されます。

Application_Launching

始めました

Application_Deactivate

Application_Activated

私はこれで終わりです

上記のイベントシーケンスに基づいて、非アクティブ化とアクティブ化の後にasync-awaitタスクが完了することがわかります。

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 に答える