🦁

[UniTask] キャンセルされても処理を続ける

2022/10/03に公開

実装

UniTask.SuppressCancellationThrow をキャンセルする可能性のあるUniTaskの後につけます。

public UniTask SomeMethods(){...};

SomeMethods().SuppressCancellationThrow()
  .ContinueWith(isCanceled => {
    if (isCanceled) {
        // キャンセルされたとき
    } else {
        // キャンセルされていないとき
    }
  })
  .Forget();

説明

UniTaskは、Unity上でasync/awaitをゼロアロケーションで書くことが可能になるオープンソースです。

async/awaitで書かれた関数は、 System.Threading.CancelletonToken など、 System.OperationCanceledException という例外で処理を中断できます。

中断すると、通常は中断した処理より後にある関数は実行されません。それはasync/awaitで書かれた関数内の処理だけではなく、 UniTask.ContinueWith のように後続するaync/awaitの処理についても同様です。

中断がかかっても処理を続けたい場合、try/catch/finally文を使用することで処理を続けることができます。ただし一般的に、try/catch文の処理は重いです。

UniTaskではtry/catch以外の方法として UniTask.SuppressCancellationThrow を使用できます。これは通常の例外のない処理の他に、 System.OperationCanceledException が発生した時も処理を実行できます。

中断したのかは、第一引数の真偽値で返却されます。

参考

GitHubで編集を提案

Discussion