したがって、この投稿への回答によると:
2) タスクの本体もキャンセル トークンを監視しており、そのトークンを含む OperationCanceledException をスローする場合 (これは ThrowIfCancellationRequested が行うことです)、タスクがその OCE を確認すると、OCE のトークンがタスクのトークンと一致するかどうかを確認します。一致する場合、その例外は協調キャンセルの確認と見なされ、タスクは (Faulted 状態ではなく) Canceled 状態に遷移します。
このことから、トークンをタスクのコンストラクターに渡してから、同じトークンの 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
}
}