3

質問: をメソッドから返されたCancellationTokenに関連付ける方法はありますか?Taskasync

一般に、がのと一致するでスローされると、 はTaskCanceled状態になります。それらが一致しない場合、タスクは次の状態になります。OperationCancelledExceptionCancellationTokenTaskCancellationTokenFaulted

void WrongCancellationTokenCausesFault()
{
    var cts1 = new CancellationTokenSource();
    var cts2 = new CancellationTokenSource();
    cts2.Cancel();

    // This task will end up in the Faulted state due to the task's CancellationToken
    // not matching the thrown OperationCanceledException's token.
    var task = Task.Run(() => cts2.Token.ThrowIfCancellationRequested(), cts1.Token);  
}

async/では、メソッドのawaitを設定する方法が見つかりませんでした(したがって、同じ種類の機能を実現します)。私のテストから、メソッドが Canceled 状態になる原因となるようです。TaskCancellationToken OperationCancelledExceptionasync

async Task AsyncMethodWithCancellation(CancellationToken ct)
{
    // If ct is cancelled, this will cause the returned Task to be in the Cancelled state
    ct.ThrowIfCancellationRequested(); 
    await Task.Delay(1);

    // This will cause the returned Task to be in the Cancelled state
    var newCts = new CancellationTokenSource();
    newCts.Cancel();
    newCts.Token.ThrowIfCancellationRequested();
}

asyncメソッドから呼び出したメソッドがキャンセルされた場合 (およびキャンセルを予期していない場合、つまり this ではない場合)、タスクが状態に入ることが予想されるため、もう少し制御できるとよいでしょうTask。-州ではありません。CancellationTokenFaultedCanceled

4

2 に答える 2

2

この設計は一般的なケースでうまく機能すると思います: 子操作がキャンセルされた場合、キャンセルは親に伝播します (最も一般的なケースは、親と子がキャンセル トークンを共有することです)。

別のセマンティクスが必要な場合は、catchメソッドで を使用して、必要なセマンティクスに適合する例外をスローできます。これらのセマンティクスを繰り返し使用する場合は、 の拡張メソッドが適しています。OperationCanceledExceptionasyncTask

于 2013-03-06T20:39:43.880 に答える