Open1
HatopopoMemo
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までは実行されることがわかる。