diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs index 09b98e6..0afd0f1 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.Generated.cs @@ -5056,5 +5056,310 @@ namespace Cysharp.Threading.Tasks } } + public static UniTask WhenAny(UniTask task1, UniTask task2) + { + return new UniTask(new WhenAnyPromise(task1, task2), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14), 0); + } + + public static UniTask WhenAny(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) + { + return new UniTask(new WhenAnyPromise(task1, task2, task3, task4, task5, task6, task7, task8, task9, task10, task11, task12, task13, task14, task15), 0); + } + + sealed partial class WhenAnyPromise : IUniTaskSource + { + public WhenAnyPromise(UniTask task1, UniTask task2) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + StartTask(task10, 9); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + StartTask(task10, 9); + StartTask(task11, 10); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + StartTask(task10, 9); + StartTask(task11, 10); + StartTask(task12, 11); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + StartTask(task10, 9); + StartTask(task11, 10); + StartTask(task12, 11); + StartTask(task13, 12); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + StartTask(task10, 9); + StartTask(task11, 10); + StartTask(task12, 11); + StartTask(task13, 12); + StartTask(task14, 13); + } + + public WhenAnyPromise(UniTask task1, UniTask task2, UniTask task3, UniTask task4, UniTask task5, UniTask task6, UniTask task7, UniTask task8, UniTask task9, UniTask task10, UniTask task11, UniTask task12, UniTask task13, UniTask task14, UniTask task15) + { + TaskTracker.TrackActiveTask(this, 3); + + StartTask(task1, 0); + StartTask(task2, 1); + StartTask(task3, 2); + StartTask(task4, 3); + StartTask(task5, 4); + StartTask(task6, 5); + StartTask(task7, 6); + StartTask(task8, 7); + StartTask(task9, 8); + StartTask(task10, 9); + StartTask(task11, 10); + StartTask(task12, 11); + StartTask(task13, 12); + StartTask(task14, 13); + StartTask(task15, 14); + } + + void StartTask(UniTask task, int index) + { + Awaiter awaiter; + + try + { + awaiter = task.GetAwaiter(); + } + catch (Exception ex) + { + core.TrySetException(ex); + return; // consume others. + } + + if (awaiter.IsCompleted) + { + TryInvokeContinuation(this, awaiter, index); + } + else + { + awaiter.SourceOnCompleted(state => + { + using (var t = (StateTuple)state) + { + TryInvokeContinuation(t.Item1, t.Item2, t.Item3); + } + }, StateTuple.Create(this, awaiter, index)); + } + } + } } } \ No newline at end of file diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.cs index 09eb32d..00ddf74 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTask.WhenAny.cs @@ -265,7 +265,7 @@ namespace Cysharp.Threading.Tasks } } - sealed class WhenAnyPromise : IUniTaskSource + sealed partial class WhenAnyPromise : IUniTaskSource { int completedCount; UniTaskCompletionSourceCore core; diff --git a/src/UniTask/Assets/Tests/AsyncTest.cs b/src/UniTask/Assets/Tests/AsyncTest.cs index c329dbf..f5f8d23 100644 --- a/src/UniTask/Assets/Tests/AsyncTest.cs +++ b/src/UniTask/Assets/Tests/AsyncTest.cs @@ -124,6 +124,19 @@ namespace Cysharp.Threading.TasksTests a2.Should().Be(999); }); + [UnityTest] + public IEnumerator WhenAnyVoid() => UniTask.ToCoroutine(async () => + { + bool result = false; + var a = UniTask.Create(async () => { result = true; }); + var b = UniTask.Yield(PlayerLoopTiming.Update, CancellationToken.None); + var c = UniTask.DelayFrame(99); + + int win = await UniTask.WhenAny(a, b, c); + win.Should().Be(0); + result.Should().Be(true); + }); + [UnityTest] public IEnumerator BothEnumeratorCheck() => UniTask.ToCoroutine(async () => {