コード例 #1
0
 private void RunEnumerator(IEnumerator enumerator)
 {
     do
     {
         if (enumerator.Current is Task)
         {
             var task = (Task)enumerator.Current;
             this.DispatchAndWait(task);
         }
         else if (enumerator.Current is SwitchTo)
         {
             var switchTo = (SwitchTo)enumerator.Current;
             if (switchTo.Target == SwitchTo.TargetType.Main && CurrentThread != null)
             {
                 var task = Task.Create(() =>
                 {
                     if (enumerator.MoveNext() && !ShouldStop)
                     {
                         RunEnumerator(enumerator);
                     }
                 });
                 this.DispatchAndWait(task);
             }
             else if (switchTo.Target == SwitchTo.TargetType.Thread && CurrentThread == null)
             {
                 return;
             }
         }
     }while (enumerator.MoveNext() && !ShouldStop);
 }
コード例 #2
0
ファイル: Task.cs プロジェクト: Seemba-Gaming/unity-sdk
        private void RunEnumerator(IEnumerator enumerator)
        {
            var currentThread = UnityThreading.ThreadBase.CurrentThread;

            do
            {
                if (enumerator.Current is Task)
                {
                    var task = (Task)enumerator.Current;
                    currentThread.DispatchAndWait(task);
                }
                else if (enumerator.Current is SwitchTo)
                {
                    var switchTo = (SwitchTo)enumerator.Current;
                    if (switchTo.Target == SwitchTo.TargetType.Main && currentThread != null)
                    {
                        var task = Task.Create(() =>
                        {
                            if (enumerator.MoveNext() && !ShouldAbort)
                            {
                                RunEnumerator(enumerator);
                            }
                        });
                        currentThread.DispatchAndWait(task);
                    }
                    else if (switchTo.Target == SwitchTo.TargetType.Thread && currentThread == null)
                    {
                        return;
                    }
                }
            }while (enumerator.MoveNext() && !ShouldAbort);
        }
コード例 #3
0
        /// <summary>
        /// Creates a new Task based upon the given action.
        /// </summary>
        /// <param name="action">The action to process at the dispatchers thread.</param>
        /// <returns>The new task.</returns>
        public Task Dispatch(Action action)
        {
            CheckAccessLimitation();
            var task = Task.Create(action);

            AddTask(task);
            return(task);
        }
コード例 #4
0
        /// <summary>
        /// Performs the given Func parallel for each element in the enumerable.
        /// </summary>
        /// <param name="action">The Func to perform for each element.</param>
        /// <param name="target">The TaskDistributor instance on which the operation should perform.</param>
        /// <returns>IEnumerable of created tasks.</returns>
        public static IEnumerable <Task <TResult> > ParallelForEach <TResult, T>(this IEnumerable <T> that, Func <T, TResult> action, TaskDistributor target)
        {
            var result = new List <Task <TResult> >();

            foreach (var element in that)
            {
                var tmp  = element;
                var task = Task.Create(() => action(tmp)).Run(target);
                result.Add(task);
            }
            return(result);
        }
コード例 #5
0
        /// <summary>
        /// Performs the given Func sequential for each element in the enumerable.
        /// </summary>
        /// <param name="action">The Func to perform for each element.</param>
        /// <param name="target">The TaskDistributor instance on which the operation should perform.</param>
        /// <returns>IEnumerable of created tasks.</returns>
        public static IEnumerable <Task <TResult> > SequentialForEach <TResult, T>(this IEnumerable <T> that, Func <T, TResult> action, TaskDistributor target)
        {
            var  result   = new List <Task <TResult> >();
            Task lastTask = null;

            foreach (var element in that)
            {
                var tmp  = element;
                var task = Task.Create(() => action(tmp));
                if (lastTask == null)
                {
                    task.Run(target);
                }
                else
                {
                    lastTask.WhenEnded(() => task.Run(target));
                }
                lastTask = task;
                result.Add(task);
            }
            return(result);
        }
コード例 #6
0
 /// <summary>
 /// Starts the Enumerator as async Task on the given TaskDistributor.
 /// </summary>
 /// <param name="target">The TaskDistributor instance on which the operation should perform.</param>
 /// <returns>The task.</returns>
 public static Task RunAsync(this IEnumerator that, TaskDistributor target)
 {
     return(target.Dispatch(Task.Create(that)));
 }
コード例 #7
0
 /// <summary>
 /// Converts the Action into an inactive Task.
 /// </summary>
 /// <returns>The task.</returns>
 public static Task AsTask(this Action that)
 {
     return(Task.Create(that));
 }
コード例 #8
0
 /// <summary>
 /// Starts the given Method as async Task on the given TaskDistributor.
 /// </summary>
 /// <param name="target">The TaskDistributor instance on which the operation should perform.</param>
 /// <param name="args">Optional arguments passed to the method.</param>
 /// <returns>The task.</returns>
 public static Task <T> RunAsync <T>(this object that, string methodName, TaskDistributor target, params object[] args)
 {
     return(Task.Create <T>(that, methodName, args).Run(target));
 }