public static async UniTask <T> Timeout <T>(this UniTask <T> task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
        {
            // left, right both suppress operation canceled exception.

            var delayCancellationTokenSource = new CancellationTokenSource();
            var timeoutTask = (UniTask)UniTask.Delay(timeout, ignoreTimeScale, timeoutCheckTiming).SuppressCancellationThrow();

            var(hasValue, value) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);

            if (!hasValue)
            {
                if (taskCancellationTokenSource != null)
                {
                    taskCancellationTokenSource.Cancel();
                    taskCancellationTokenSource.Dispose();
                }

                throw new TimeoutException("Exceed Timeout:" + timeout);
            }
            else
            {
                delayCancellationTokenSource.Cancel();
                delayCancellationTokenSource.Dispose();
            }

            if (value.IsCanceled)
            {
                Error.ThrowOperationCanceledException();
            }

            return(value.Result);
        }
        public static UniTask <UnityEngine.Object> ConfigureAwait(this ResourceRequest resourceRequest, IProgress <float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellation = default(CancellationToken))
        {
            Error.ThrowArgumentNullException(resourceRequest, nameof(resourceRequest));

            var awaiter = new ResourceRequestConfiguredAwaiter(resourceRequest, progress, cancellation);

            if (!awaiter.IsCompleted)
            {
                PlayerLoopHelper.AddAction(timing, awaiter);
            }
            return(new UniTask <UnityEngine.Object>(awaiter));
        }
Beispiel #3
0
 public static void AddAction(PlayerLoopTiming timing, IPlayerLoopItem action)
 {
     runners[(int)timing].AddAction(action);
 }
Beispiel #4
0
        /// <summary>
        /// Timeout with suppress OperationCanceledException. Returns (bool, IsCacneled).
        /// </summary>
        public static async UniTask <bool> TimeoutWithoutException(this UniTask task, TimeSpan timeout,
                                                                   DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update,
                                                                   CancellationTokenSource taskCancellationTokenSource = null)
        {
            var delayCancellationTokenSource = new CancellationTokenSource();
            var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token)
                              .SuppressCancellationThrow();

            int  winArgIndex;
            bool taskResultIsCanceled;

            try {
                (winArgIndex, taskResultIsCanceled, _) =
                    await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);
            }
            catch {
                delayCancellationTokenSource.Cancel();
                delayCancellationTokenSource.Dispose();
                return(true);
            }

            // timeout
            if (winArgIndex == 1)
            {
                if (taskCancellationTokenSource != null)
                {
                    taskCancellationTokenSource.Cancel();
                    taskCancellationTokenSource.Dispose();
                }

                return(true);
            }
            else
            {
                delayCancellationTokenSource.Cancel();
                delayCancellationTokenSource.Dispose();
            }

            if (taskResultIsCanceled)
            {
                return(true);
            }

            return(false);
        }
        public static UniTask ConfigureAwait(this AsyncOperation asyncOperation, IProgress <float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellation = default(CancellationToken))
        {
            Guard.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));

            var awaiter = new AsyncOperationConfiguredAwaiter(asyncOperation, progress, cancellation);

            PlayerLoopHelper.AddAction(timing, awaiter);
            return(new UniTask(awaiter));
        }
 public EveryUpdate(PlayerLoopTiming updateTiming)
 {
     this.updateTiming = updateTiming;
 }
Beispiel #7
0
        public static UniTask ToUniTask(this AsyncOperationHandle handle, IProgress <float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (cancellationToken.IsCancellationRequested)
            {
                return(UniTask.FromCanceled(cancellationToken));
            }

            if (!handle.IsValid())
            {
                throw new Exception("Attempting to use an invalid operation handle");
            }

            if (handle.IsDone)
            {
                if (handle.Status == AsyncOperationStatus.Failed)
                {
                    return(UniTask.FromException(handle.OperationException));
                }
                return(UniTask.CompletedTask);
            }

            return(new UniTask(AsyncOperationHandleConfiguredSource.Create(handle, timing, progress, cancellationToken, out var token), token));
        }
 public static YieldAwaitable Yield(PlayerLoopTiming timing = PlayerLoopTiming.Update)
 {
     // optimized for single continuation
     return(new YieldAwaitable(timing));
 }
 public DelayIgnoreTimeScalePromise(TimeSpan delayFrameTimeSpan, PlayerLoopTiming timing, CancellationToken cancellationToken)
     : base(timing, cancellationToken, 2)
 {
     this.delayFrameTimeSpan = (float)delayFrameTimeSpan.TotalSeconds;
 }
Beispiel #10
0
 /// <summary>
 /// Similar as UniTask.Yield but guaranteed run on next frame.
 /// </summary>
 public static UniTask NextFrame(PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellationToken = default)
 {
     return(new UniTask(NextFramePromise.Create(timing, cancellationToken, out var token), token));
 }
Beispiel #11
0
        public static UniTask Delay(int millisecondsDelay, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
        {
            var delayTimeSpan = TimeSpan.FromMilliseconds(millisecondsDelay);

            if (delayTimeSpan < TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException("Delay does not allow minus millisecondsDelay. millisecondsDelay:" + millisecondsDelay);
            }

            return((ignoreTimeScale)
                ? new UniTask(DelayIgnoreTimeScalePromise.Create(delayTimeSpan, delayTiming, cancellationToken, out var token), token)
                : new UniTask(DelayPromise.Create(delayTimeSpan, delayTiming, cancellationToken, out token), token));
        }
Beispiel #12
0
 public static UniTask Yield(PlayerLoopTiming timing, CancellationToken cancellationToken)
 {
     return(new UniTask(YieldPromise.Create(timing, cancellationToken, out var token), token));
 }
 /// <summary>
 /// Timeout with suppress OperationCanceledException. Returns (bool IsTimeout, T Result).
 /// </summary>
 public static async UniTask <(bool IsTimeout, T Result)> TimeoutWithoutException <T>(this UniTask <T> task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
 {
        /// <summary>
        /// Timeout with suppress OperationCanceledException. Returns (bool, IsCacneled).
        /// </summary>
        public static async UniTask <bool> TimeoutWithoutException(this UniTask task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
        {
            var v = await TimeoutWithoutException(task.AsAsyncUnitUniTask(), timeout, ignoreTimeScale, timeoutCheckTiming, taskCancellationTokenSource);

            return(v.IsTimeout);
        }
Beispiel #15
0
 public static UniTask WaitUntilCanceled(CancellationToken cancellationToken,
                                         PlayerLoopTiming timing = PlayerLoopTiming.Update)
 {
     return(new UniTask(WaitUntilCanceledPromise.Create(cancellationToken, timing, out var token), token));
 }
 public static UniTask Yield(PlayerLoopTiming timing, CancellationToken cancellationToken)
 {
     return(new UniTask(new YieldPromise(timing, cancellationToken)));
 }
Beispiel #17
0
            public static IUniTaskSource <U> Create(T target, Func <T, U> monitorFunction,
                                                    IEqualityComparer <U> equalityComparer, PlayerLoopTiming timing, CancellationToken cancellationToken,
                                                    out short token)
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return(AutoResetUniTaskCompletionSource <U> .CreateFromCanceled(cancellationToken, out token));
                }

                if (!pool.TryPop(out var result))
                {
                    result = new WaitUntilValueChangedStandardObjectPromise <T, U>();
                }

                result.target            = new WeakReference <T>(target, false); // wrap in WeakReference.
                result.monitorFunction   = monitorFunction;
                result.currentValue      = monitorFunction(target);
                result.equalityComparer  = equalityComparer ?? UnityEqualityComparer.GetDefault <U>();
                result.cancellationToken = cancellationToken;

                TaskTracker.TrackActiveTask(result, 3);

                PlayerLoopHelper.AddAction(timing, result);

                token = result.core.Version;
                return(result);
            }
 public YieldAwaitable(PlayerLoopTiming timing)
 {
     this.timing = timing;
 }
 public static IUniTaskAsyncEnumerable <AsyncUnit> EveryUpdate(
     PlayerLoopTiming updateTiming = PlayerLoopTiming.Update)
 {
     return(new EveryUpdate(updateTiming));
 }
 public Awaiter(PlayerLoopTiming timing)
 {
     this.timing = timing;
 }
Beispiel #21
0
        public static async UniTask <T> Timeout <T>(this UniTask <T> task, TimeSpan timeout,
                                                    DelayType delayType = DelayType.DeltaTime, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update,
                                                    CancellationTokenSource taskCancellationTokenSource = null)
        {
            var delayCancellationTokenSource = new CancellationTokenSource();
            var timeoutTask = UniTask.Delay(timeout, delayType, timeoutCheckTiming, delayCancellationTokenSource.Token)
                              .SuppressCancellationThrow();

            int winArgIndex;

            (bool IsCanceled, T Result)taskResult;
            try {
                (winArgIndex, taskResult, _) = await UniTask.WhenAny(task.SuppressCancellationThrow(), timeoutTask);
            }
            catch {
                delayCancellationTokenSource.Cancel();
                delayCancellationTokenSource.Dispose();
                throw;
            }

            // timeout
            if (winArgIndex == 1)
            {
                if (taskCancellationTokenSource != null)
                {
                    taskCancellationTokenSource.Cancel();
                    taskCancellationTokenSource.Dispose();
                }

                throw new TimeoutException("Exceed Timeout:" + timeout);
            }
            else
            {
                delayCancellationTokenSource.Cancel();
                delayCancellationTokenSource.Dispose();
            }

            if (taskResult.IsCanceled)
            {
                Error.ThrowOperationCanceledException();
            }

            return(taskResult.Result);
        }
        public static UniTask Delay(TimeSpan delayTimeSpan, bool ignoreTimeScale = false, PlayerLoopTiming delayTiming = PlayerLoopTiming.Update, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (delayTimeSpan < TimeSpan.Zero)
            {
                throw new ArgumentOutOfRangeException("Delay does not allow minus delayFrameCount. delayTimeSpan:" + delayTimeSpan);
            }

            return((ignoreTimeScale)
                ? new DelayIgnoreTimeScalePromise(delayTimeSpan, delayTiming, cancellationToken).Task
                : new DelayPromise(delayTimeSpan, delayTiming, cancellationToken).Task);
        }
Beispiel #23
0
 /// <summary>
 /// Timeout with suppress OperationCanceledException. Returns (bool IsTimeout, T Result).
 /// </summary>
 public static async UniTask <(bool IsTimeout, T Result)> TimeoutWithoutException <T>(this UniTask <T> task,
                                                                                      TimeSpan timeout, DelayType delayType = DelayType.DeltaTime,
                                                                                      PlayerLoopTiming timeoutCheckTiming   = PlayerLoopTiming.Update,
                                                                                      CancellationTokenSource taskCancellationTokenSource = null)
 {
 public YieldPromise(PlayerLoopTiming timing, CancellationToken cancellationToken)
     : base(timing, cancellationToken, 2)
 {
 }
        public static UniTask <UnityWebRequest> ConfigureAwait(this UnityWebRequestAsyncOperation asyncOperation, IProgress <float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellation = default(CancellationToken))
        {
            Error.ThrowArgumentNullException(asyncOperation, nameof(asyncOperation));

            var awaiter = new UnityWebRequestAsyncOperationConfiguredAwaiter(asyncOperation, progress, cancellation);

            if (!awaiter.IsCompleted)
            {
                PlayerLoopHelper.AddAction(timing, awaiter);
            }
            return(new UniTask <UnityWebRequest>(awaiter));
        }
 public DelayFramePromise(int delayFrameCount, PlayerLoopTiming timing, CancellationToken cancellationToken)
     : base(timing, cancellationToken, 2)
 {
     this.delayFrameCount   = delayFrameCount;
     this.currentFrameCount = 0;
 }
        public static UniTask ConfigureAwait(this WWW www, IProgress <float> progress = null, PlayerLoopTiming timing = PlayerLoopTiming.Update, CancellationToken cancellation = default(CancellationToken))
        {
            Error.ThrowArgumentNullException(www, nameof(www));

            var awaiter = new WWWConfiguredAwaiter(www, progress, cancellation);

            if (!awaiter.IsCompleted)
            {
                PlayerLoopHelper.AddAction(timing, awaiter);
            }
            return(new UniTask(awaiter));
        }
Beispiel #28
0
 public static UniTask WaitWhile(Func <bool> predicate, PlayerLoopTiming timing = PlayerLoopTiming.Update,
                                 CancellationToken cancellationToken            = default(CancellationToken))
 {
     return(new UniTask(WaitWhilePromise.Create(predicate, timing, cancellationToken, out var token), token));
 }
Beispiel #29
0
 public static void AddContinuation(PlayerLoopTiming timing, Action continuation)
 {
     yielders[(int)timing].Enqueue(continuation);
 }
 public static UniTask Timeout(this UniTask task, TimeSpan timeout, bool ignoreTimeScale = true, PlayerLoopTiming timeoutCheckTiming = PlayerLoopTiming.Update, CancellationTokenSource taskCancellationTokenSource = null)
 {
     return(Timeout(task.AsAsyncUnitUniTask(), timeout, ignoreTimeScale, timeoutCheckTiming, taskCancellationTokenSource));
 }