// Count down until all 4 are signaled CountdownEvent ce = new CountdownEvent(4); ce.Signal(); ce.Wait(); // count up by add one for each work ce = new CountdownEvent(1); ce.AddCount(1); ce.Signal(); ce.Wait(); // Inlining -- Recursive Decomposition // walk by directly parallel void Walk2<T>(Tree<T> root, Action<T> action) { if (root == null) return; Parallel.Invoke( ()=> action(root.Data), () => Walk2(root.Left, action), () => Walk2(root.Right, action)); } //Continuation Chaining // Parallel <> Sum of Tasks, Unwrap() map Task<Task> to Task for Completion. if (root == null) return _CompletedTask; Task<Task> t2 = Task.Factory.StartNew(() => Walk(root.Left, action)); Task<Task> t3 = Task.Factory.StartNew(() => Walk(root.Right, action)); return Task.Factory.ContinueWhenAll(new Task[] { t1, t2.Unwrap(), t3.Unwrap() }, task => Task.WaitAll(task)); public static Task _CompletedTask = ((Func<Task>)(() => { TaskCompletionSource<object> ts = new TaskCompletionSource<object>(); ts.SetResult(null); return ts.Task; }))(); //Parallel with options: // option can cacell, set schedule, MaxDegree. // Parallel.For can be stoped by loop.Stop() inside For Parallel.Invoke(opts, () => { }, () => { }, () => { }); CancellationTokenSource ts = new CancellationTokenSource(); ParallelOptions opts = new ParallelOptions() { MaxDegreeOfParallelism = 2, TaskScheduler = TaskScheduler.FromCurrentSynchronizationContext(), CancellationToken = ts.Token }; ParallelLoopResult res = Parallel.For(0, 10000, () => 1, (j, loop, sub) => { if (loop.ShouldExitCurrentIteration) return 0; loop.Stop();
Sunday, July 6, 2014
TPL Fork Join code Pattern
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment