次のタスクを定義しました
var t = Task.Factory.StartNew(
() => LongRunningMethod( cancellationToken ),
cancellationToken
);
t.ContinueWith(
Callback,
cancellationToken,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext()
);
の中でLongRunningMethod
、キャンセルトークンにキャンセルが要求されているかどうかを確認し、要求されている場合はメソッドから戻ります。それだけでうまくいきます。
ただし、このシナリオではコールバックは呼び出されません。上記の2行目を次のように置き換えると、コールバックが呼び出されます
t.ContinueWith(
x => Callback( x, cancellationToken ),
TaskScheduler.FromCurrentSynchronizationContext()
);
この状況でも、タスクは実行が完了したと見なします。
最初の呼び出しが機能しないのはなぜですか?TaskContinuationOptions.None
スレッドの状態に関係なく、コールバックが呼び出されるという印象を受けました。
次の電話でタスクをキャンセルします。
_cancellationTokenSource.Cancel();
やや関連性のある注意点として、キャンセルトークンを渡さなければならないことは、タスクライブラリの主要な設計上の欠陥のように思われます。