UniTask
をキャンセルするためには通常CancellationToken
を使用します。
例えば以下のような感じです。
var cts = new CancellationTokenSource();
// 三秒後にキャンセル
UniTask.Delay(3000).ContinueWith(() =>
{
cts.Cancell();
}).Forget();
// asyncなメソッド
HogeAsync(cts.Token).Forget();
参考:【UniRx.Async】UniTaskのキャンセル覚書【Unity】
Observable
に比べてちょっと面倒ですね。
Observable
であれば以下のように書けます。
// 3秒後に発行
var delay = Observable.Timer(TimeSpan.FromMilliseconds(3000));
// delayが来るまで出力する
Observable.Interval(TimeSpan.FromMilliseconds(100))
.TakeUntil(delay)
.Subscribe(i => Debug.Log(i));
UnitTaskでUniTaskをキャンセルする
UniTask
がCancellationToken
に変換できれば簡単に実現できます。
この変換は簡単に行うことができます。
public static CancellationToken ToCancellationToken(this UniTask task)
{
if (task.IsCompleted)
{
return cancelledToken;
}
var source = new CancellationTokenSource();
Fire(source, task).Forget();
return source.Token;
}
static async UniTaskVoid Fire(CancellationTokenSource source, UniTask task)
{
try
{
await task;
}
catch
{
}
source.Cancel();
}
(UniTask.ToObservable
とほぼ同じ実装です)
これを使用すると最初のサンプルはこうなります。
var token = UniTask.Delay(3000).ToCancellationToken();
// asyncなメソッド
Fuga(token).Forget();
簡単になりました
最後に
ソースコード全体は以下にあります。
yaegaki/UniTaskCancellationTokenExtensions.cs
あまり調べずに書いたのですでに同じような関数が実装されているなら教えてください。