コード例 #1
0
        /// <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);
        }
コード例 #2
0
 /// <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);
 }
コード例 #3
0
        /// <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);
        }