1

AsyncUIおよびWinRT XAML Toolkitライブラリの待機可能な拡張メソッドにキャンセル サポートを追加することを検討しています。基本 Task クラスには組み込みの Cancel() メソッドまたはイベントがなく、タスクが定期的にチェックする必要があるキャンセル トークンに依存しているようです。タスクは TaskCompletionSource を使用して生成され、スレッド プール スレッドでループを実行してトークンをチェックする代わりに、イベントに応答して UI スレッドでタスクをキャンセルしたいので、UI シナリオでは意味がないと思います。 .

私のタスクは現在、ストーリーボードの完了やボタンのクリックなどの UI イベントが発生すると完了します。したがって、キャンセルをサポートしたい場合は、イベントからサブスクライブを解除し、アニメーションの停止などの他のクリーンアップを実行して、キャンセル要求に応答する必要があります。

TaskCompletionSource を使用する代わりに、ある種の CancellableUITask 基本クラスを作成することを考えているので、タスクの消費者が呼び出すことができる Cancel() メソッドを公開できます (たとえば、ボタンのクリックに応答して待機中のアニメーションを停止するため)。ストーリーボードの awaiter タスクをオーバーライドしてクリーンアップを実行できる仮想 OnCancellationRequested() メソッドのように。

それは理にかなっていますか?ここで説明していることを達成するための最良の方法は何ですか?

4

1 に答える 1

1

タスクが定期的にキャンセルを確認する必要はありません。これは、最も一般的な方法です。タスクがイベント駆動型の場合、CancellationTokenキャンセルされたときに呼び出される に対してハンドラーを登録できます。を参照してくださいCancellationToken.Register

したがって、コードは次のようになります。

public Task DoSomethingAsync(CancellationToken cancellationToken = default(CancellationToken))
{
    var tcs = new TaskCompletionSource();

    if (cancellationToken.CanBeCanceled)
    {
        // register for notification of cancellation
        cancellationToken.Register(...);
    }

    // set up other handlers and what-not

    return tcs.Task;
}
于 2012-09-11T20:13:59.433 に答える