Я определил следующую задачу
var t = Task.Factory.StartNew(
() => LongRunningMethod( cancellationToken ),
cancellationToken
);
t.ContinueWith(
Callback,
cancellationToken,
TaskContinuationOptions.None,
TaskScheduler.FromCurrentSynchronizationContext()
);
Внутри LongRunningMethod
я проверяю, есть ли у токена отмены запрошенная отмена, и если да, то возвращаюсь из метода. Это хорошо работает.
Однако в этом сценарии обратный вызов не вызывается. Обратный вызов вызывается , если я заменяю вторую строку выше на
t.ContinueWith(
x => Callback( x, cancellationToken ),
TaskScheduler.FromCurrentSynchronizationContext()
);
В этой ситуации задача по-прежнему считает, что она выполнена.
Почему не работает первый звонок? У меня сложилось впечатление, что TaskContinuationOptions.None
означает, что обратный вызов будет вызываться независимо от состояния потока.
Я отменяю Задание по телефону:
_cancellationTokenSource.Cancel();
В некотором роде, необходимость передачи токенов отмены кажется серьезным недостатком дизайна библиотеки задач.