UniTaskのWhenAnyで終了しなかった側のタスクはどうなる?

質問

UniTaskのWhenAnyで終了しなかった側のタスクはどうなるのでしょうか?

回答

タスクは走り続けます。

意図的にそうするなら良いのですが気が付かずに放置しちゃうことが多々あります。特にUniRxのIObservableをToUniTaskするときとか。ちゃんとキャンセルするようにしましょう。

例↓

public class UniTaskTest : MonoBehaviour
{
    void Start()
    {
        var cts = new CancellationTokenSource();
        UniTask.Void(async () =>
        {
            var index = await UniTask.WhenAny(WaitKeyDown1(cts.Token), WaitKeyDown2(cts.Token));
            Debug.Log($"task {index+1} is fired.");
            cts.Cancel();//どっちか終わったみたいなのでキャンセルする
        });
    }

    private async UniTask WaitKeyDown1(CancellationToken token)
    {
        while (!token.IsCancellationRequested)
        {
            if (Input.GetKeyDown(KeyCode.Alpha1))
                break;
            await UniTask.Yield();
        }
        Debug.Log("WaitKeyDown1 Complete!");
    }
    
    private async UniTask WaitKeyDown2(CancellationToken token)
    {
        while (!token.IsCancellationRequested)
        {
            if (Input.GetKeyDown(KeyCode.Alpha2))
                break;
            await UniTask.Yield();
        }
        Debug.Log("WaitKeyDown2 Complete!");
    }
}