Таким образом, в соответствии с ответом на this post:Задача аннулирование бросание исключения
2) Если тело задачи также следит за отмены лексемы и выбрасывает OperationCanceledException, содержащее этот маркер (который что ThrowIfCancellationRequested делает), тогда, когда задача видит , что OCE, он проверяет, совпадает ли токен OCE с токеном задачи. Если это так, то это исключение рассматривается как подтверждение отмены сотрудничества , а задача переходит к состоянию Отменено (а не в состоянии Faulted).
Из этого я понял, что, передавая маркер в конструктор задачи и затем вызвать этот метод тот же маркер в 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
}
}