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); }
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); }
/// <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); }
/// <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); }
/// <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); }
/// <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))); }
/// <summary> /// Converts the Action into an inactive Task. /// </summary> /// <returns>The task.</returns> public static Task AsTask(this Action that) { return(Task.Create(that)); }
/// <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)); }