因此,根据对这篇文章的回答:
2) 如果任务主体也在监视取消令牌并抛出包含该令牌的 OperationCanceledException(这是 ThrowIfCancellationRequested 所做的),那么当任务看到该 OCE 时,它会检查 OCE 的令牌是否与任务的令牌匹配。如果是这样,则该异常被视为对合作取消的确认,并且任务转换到 Canceled 状态(而不是 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
}
}