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)); }
public static void AddAction(PlayerLoopTiming timing, IPlayerLoopItem action) { runners[(int)timing].AddAction(action); }
/// <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; }
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; }
/// <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)); }
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)); }
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); }
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))); }
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; }
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); }
/// <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)); }
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)); }
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)); }