1

したがって、この投稿への回答によると:

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
        }
    }
4

3 に答える 3

3

この行

token.ThrowIfCancellationRequested();

明示的に例外をスローします。リンクが伝えていたのは、タスクのトークンがスローされたばかりのトークンと一致する場合OperationCanceledException、「タスクは (Faulted 状態ではなく) Canceled 状態に移行する」ということです。

つまり、タスクがキャンセルされたときに例外をスローしたくない場合は、その行を省略してください。

于 2015-04-21T15:19:48.090 に答える