/// <summary>
        /// Returns completed task with result
        /// </summary>
        public static PandaTask <T> GetCompletedTask <T>(T result)
        {
            var resultTask = new PandaTask <T>();

            resultTask.SetValue(result);
            return(resultTask);
        }
        /// <summary>
        /// Helps to get a <see cref="IPandaTask" /> from callback based async method.
        /// </summary>
        /// <param name="resultTask">Resulting task that you will await</param>
        /// <returns>Callback to pass as completion handler</returns>
        public static Action GetCallbackTask(out PandaTask resultTask)
        {
            var result = new PandaTask();

            resultTask = result;
            return(result.Resolve);
        }
        /// <summary>
        /// Helps to get a <see cref="IPandaTask" /> from callback based async method.
        /// </summary>
        /// <typeparam name="T">Result type</typeparam>
        /// <param name="resultTask">Resulting task that you will await</param>
        /// <returns>Callback to pass as completion handler</returns>
        public static Action <T> GetCallbackTask <T>(out PandaTask <T> resultTask)
        {
            var result = new PandaTask <T>();

            resultTask = result;
            return(result.SetValue);
        }
        /// <summary>
        /// Returns rejected task with error
        /// </summary>
        public static PandaTask GetTaskWithError(Exception error)
        {
            var resultTask = new PandaTask();

            resultTask.Reject(error);
            return(resultTask);
        }
Exemplo n.º 5
0
        public void SetResult()
        {
            if (_task == null)
            {
                _task = new PandaTask <VoidResult>();
            }

            _task.Resolve();
        }
        public void SetResult(TResult value)
        {
            if (_task == null)
            {
                _task = new PandaTask <TResult>();
            }

            _task.SetValue(value);
        }
        public void SetException(Exception ex)
        {
            if (_task == null)
            {
                _task = new PandaTask <TResult>();
            }

            _task.Reject(ex);
        }
        static PandaTasksUtilities()
        {
            //create resolved and canceled tasks. Both tasks will be created before first class access.
            var completedTask = new PandaTask();

            completedTask.Resolve();
            CompletedTask = completedTask;

            var canceledTask = new PandaTask();

            canceledTask.TryCancel();
            CanceledTaskInternal = canceledTask;
        }
        private static Action GetMoveNextAction <TStateMachine>(ref PandaTask <TResult> taskField, ref TStateMachine stateMachine)
            where TStateMachine : IAsyncStateMachine
        {
            if (taskField is AsyncStateMachineTask <TStateMachine> stateMachineTask)
            {
                return(stateMachineTask.MoveNextAction);
            }

            var ret = new AsyncStateMachineTask <TStateMachine>();

            taskField        = ret;
            ret.StateMachine = stateMachine;

            return(ret.MoveNextAction);
        }
        private UnsafeCompletionSource(CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                _controlledTask = PandaTasksUtilities.CanceledTaskInternal;
                return;
            }

            _controlledTask = new PandaTask();

            if (cancellationToken.CanBeCanceled)
            {
                cancellationToken.Register(TryCancelTaskInternal);
            }
        }
        public PandaTaskCompletionSource(CancellationToken cancellationToken)
        {
            if (cancellationToken.IsCancellationRequested)
            {
                _controlledTask = PandaTasksUtilities.GetCanceledTaskInternal <TResult>();
                return;
            }

            _controlledTask = new PandaTask <TResult>();

            if (cancellationToken.CanBeCanceled)
            {
                cancellationToken.Register(TryCancelTaskInternal);
            }
        }
 internal static void AwaitOnCompleted <TAwaiter, TStateMachine>(ref TAwaiter awaiter, ref TStateMachine machine, ref PandaTask <TResult> taskField)
     where TAwaiter : INotifyCompletion
     where TStateMachine : IAsyncStateMachine
 {
     awaiter.OnCompleted(GetMoveNextAction(ref taskField, ref machine));
 }
 /// <summary>
 /// Return exception to stack. Must be in Unity thread!
 /// </summary>
 /// <param name="task">source task</param>
 /// <param name="ignoreCancel">ignore OperationCanceledException</param>
 public static void RethrowError(this PandaTask task, bool ignoreCancel = false)
 {
     RethrowError(( IPandaTask )task, ignoreCancel);
 }
 /// <summary>
 /// Adds timeout handling for given task. If it does not complete within given time an exception will be thrown
 /// </summary>
 /// <param name="task">Source task</param>
 /// <param name="milliseconds">Timeout in milliseconds</param>
 /// <param name="timeoutMessage">Message for exception</param>
 /// <exception cref="ArgumentException">Thrown if time is negative</exception>
 /// <exception cref="TimeoutException" />
 public static PandaTask <T> OrTimeout <T>(this PandaTask <T> task, int milliseconds, string timeoutMessage = null)
 {
     return(OrTimeout(task, TimeSpan.FromMilliseconds(milliseconds), timeoutMessage));
 }
 /// <summary>
 /// Adds timeout handling for given task. If it does not complete within given time an exception will be thrown
 /// </summary>
 /// <param name="task">Source task</param>
 /// <param name="timeout">Timeout time</param>
 /// <param name="timeoutMessage">Message for exception</param>
 /// <exception cref="ArgumentException">Thrown if time is negative</exception>
 /// <exception cref="TimeoutException" />
 public static PandaTask <T> OrTimeout <T>(this PandaTask <T> task, TimeSpan timeout, string timeoutMessage = null)
 {
     return((PandaTask <T>)OrTimeout((IPandaTask <T>)task, timeout, timeoutMessage));
 }
 private UnsafeCompletionSource(PandaTask controlledTask)
 {
     _controlledTask = controlledTask;
 }
Exemplo n.º 17
0
 public PandaTaskCompletionSource()
 {
     _controlledTask = new PandaTask();
 }
 static CancelledPandaTaskProvider()
 {
     Value = new PandaTask <T>();
     Value.Reject(new TaskCanceledException());
 }