Итак, согласно ответу на этот пост :
2) Если тело задачи также отслеживает токен отмены и генерирует исключение OperationCanceledException, содержащее этот токен (что и делает ThrowIfCancellationRequested), то, когда задача видит этот OCE, она проверяет, соответствует ли токен OCE маркеру задачи. Если это так, это исключение рассматривается как подтверждение совместной отмены, и задача переходит в состояние «Отменено» (а не в состояние «Ошибка»).
Из этого я понял, что, передав токен конструктору задачи, а затем вызвав метод ThrowIfCancellationRequested() того же токена, задача на самом деле завершится мирно, без необходимости явного перехвата OperationCanceledException.
Однако, как выясняется, выбрасывается исключение, поэтому я полагаю, что, возможно, неправильно понял механику.
Мой код:
public void AI()
{
IsBusy = true;
var token = stopGameCancellationTokenSource.Token;
var workTask = new Task(() => aiWork(token), token);
workTask.Start();
workTask.ContinueWith(task => { IsBusy = false; });
}
private void aiWork(CancellationToken token)
{
while ( true)
{
//Some computation being done here
token.ThrowIfCancellationRequested(); //Exception is thrown here, I thought it wouldn't
//More computation here, which I don't want to happen if cancellation has benn requested
}
}