Open1

HatopopoMemo

hatopopohatopopo

UniTaskのCancellationTokenSourceでCancelする際の処理

asyncメソッド実行時にCancellationTokenをリレーしていくが、具体どこでOperationCanceledException が吐かれるのかを改めて調べた。

結論 : Cancel処理が行われた、次の await が呼ばれる瞬間

この結論さえ覚えておけばエラーハンドリングも容易にできそう。

実験

    private CancellationTokenSource _cts;

    private async void Start()
    {
        _cts = new CancellationTokenSource();

        Debug.Log($"{nameof(TokenTest)}.{nameof(Start)}");
        await AsyncMethod(_cts.Token);
        Debug.Log($"end {nameof(AsyncMethod)}");
        await UniTask.Delay(1, cancellationToken: _cts.Token);
        Debug.Log("Hello,,,");
    }

    private async UniTask AsyncMethod(CancellationToken token)
    {
        Debug.Log($"{nameof(AsyncMethod)}");
        await UniTask.Delay(1, cancellationToken: token);
        Debug.Log("Cancel");
        _cts.Cancel();
        Debug.Log("Canceled");
    }

この場合のログは AsyncMethod が完了した際の end AsyncMethod までのログが出て、OperationCanceledException が呼ばれた。
よって、CancellationTokenSource.Cancel() が呼ばれたタイミングでは同期メソッドのキャンセルはされずに、次のawaitまでは実行されることがわかる。