3

バックグラウンド操作のためにwp7アプリでTPLを使用しています。

アプリがタスクを開始します。

var task =
    Task.Factory.StartNew(
        () =>
        {
            // Some sort of operations
        });

この後、アプリは UI の更新を実行します。

task.ContinueWith(
    obj =>
    {
        // UI updates
    },
    new CancelationSource.Token,
    TaskContinuationOptions.None,
    TaskScheduler.FromCurrentSynchronizationContext());

しかし問題がある。戻るボタンを押してアプリを閉じると、タスクがまだ終了していない場合、アプリは内部 ThreadAbortException で AggregateException をスローします。私が理解できるように、これはバックグラウンド スレッドが正しく終了しなかったためです。

どうすればこれを防ぐことができますか? たぶん、タスクをキャンセルする正しい方法がいくつかありますか?

私には 1 つのアイデアしかありません。この例外をキャッチして、何も起こらなかったふりをすることです。そうですか?

4

1 に答える 1

1

戻るボタンを押してアプリケーションを終了すると、フレームワークは進行中のすべてのスレッドを中止する前に短時間待機します。例外を引き起こしているのはその中止です。

例外を回避したい場合は、メイン ページで BackKeyPress イベントを処理し (またはバック プレスを検出する他の方法で)、Task オブジェクトをキャンセルする必要があります。これはもちろん、キャンセル トークンを追跡する必要があることを意味します。

于 2012-05-20T23:07:24.227 に答える