diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs index d330109..794a39c 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs @@ -41,6 +41,37 @@ namespace Cysharp.Threading.Tasks return promise.Task; } + public static UniTask AsUniTask(this Task task, CancellationToken cancellationToken = default, bool useCurrentSynchronizationContext = true) + { + var promise = new UniTaskCompletionSource(); + var state = StatePool, CancellationToken>.Create(promise, cancellationToken); + + task.ContinueWith((x, state) => + { + var tuple = (StateTuple, CancellationToken>)state; + tuple.Deconstruct(out var p, out var token); + + switch (x.Status) + { + case TaskStatus.Canceled: + p.TrySetCanceled(token); + break; + case TaskStatus.Faulted: + p.TrySetException(x.Exception); + break; + case TaskStatus.RanToCompletion: + p.TrySetResult(x.Result); + break; + default: + throw new NotSupportedException(); + } + + tuple.Dispose(); + }, state, useCurrentSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); + + return promise.Task; + } + /// /// Convert Task -> UniTask. /// @@ -71,6 +102,37 @@ namespace Cysharp.Threading.Tasks return promise.Task; } + public static UniTask AsUniTask(this Task task, CancellationToken cancellationToken = default, bool useCurrentSynchronizationContext = true) + { + var promise = new UniTaskCompletionSource(); + var state = StatePool.Create(promise, cancellationToken); + + task.ContinueWith((x, state) => + { + var tuple = (StateTuple)state; + tuple.Deconstruct(out var p, out var token); + + switch (x.Status) + { + case TaskStatus.Canceled: + p.TrySetCanceled(token); + break; + case TaskStatus.Faulted: + p.TrySetException(x.Exception); + break; + case TaskStatus.RanToCompletion: + p.TrySetResult(); + break; + default: + throw new NotSupportedException(); + } + + tuple.Dispose(); + }, state, useCurrentSynchronizationContext ? TaskScheduler.FromCurrentSynchronizationContext() : TaskScheduler.Current); + + return promise.Task; + } + public static Task AsTask(this UniTask task) { try