/// <summary> /// Creates a task that will complete successfully after the given timespan. /// </summary> /// <param name="p_timespan">The amount of time to wait.</param> /// <returns>A new task.</returns> public static UnityTask RunDelay(float p_seconds, CancellationToken p_cancellationToken) { var tcs = new UnityTaskCompletionSource <int>(); var cancellation = p_cancellationToken.Register(() => tcs.TrySetCanceled()); tcs.Task.TaskGenerator = () => DelayCoroutine(p_seconds); tcs.Task.ReturnResult = _ => { try { tcs.TrySetResult(0); cancellation.Dispose(); } catch (Exception e) { tcs.TrySetException(e); cancellation.Dispose(); } }; if (Thread.CurrentThread.IsBackground)// 如果当前不在前端线程,则切换 { ForegroundInvoker.Invoke(() => { tcs.Task.TaskCoroutine = UnityTaskScheduler.FromCurrentSynchronizationContext().Post(tcs.Task.TaskGenerator(), tcs.Task.ReturnResult); }); } else { tcs.Task.TaskCoroutine = UnityTaskScheduler.FromCurrentSynchronizationContext().Post(tcs.Task.TaskGenerator(), tcs.Task.ReturnResult); } return(tcs.Task); }
/// <summary> /// try to cancel /// </summary> /// <param name="p_result"></param> /// <returns></returns> internal bool TrySetCanceled() { if (m_isCompleted) { return(false); } UnityTaskScheduler.FromCurrentSynchronizationContext().Stop(TaskCoroutine); m_isCompleted = true; this.m_isCanceled = true; RunContinuations(); return(true); }
/// <summary> /// Creates and starts a Task<TResult> /// </summary> /// <typeparam name="TArg1"></typeparam> /// <param name="p_func"></param> /// <returns></returns> public UnityTask <TResult> StartNew <TResult>(Func <System.Collections.IEnumerator> p_func) { var tcs = new UnityTaskCompletionSource <TResult>(); tcs.Task.TaskGenerator = () => p_func(); tcs.Task.ReturnResult = result => { try { tcs.SetResult((TResult)result); } catch (Exception e) { tcs.SetException(e); } }; tcs.Task.TaskCoroutine = UnityTaskScheduler.FromCurrentSynchronizationContext().Post(tcs.Task.TaskGenerator(), tcs.Task.ReturnResult); return(tcs.Task); }