public Tuple <PerformanceAggregate, T[]> DoParallelTasks <T>(int from, int to, int parallelism, Func <int, Task <Tuple <PerformanceCounter, T> > > task, Action <int> iterrationAction) { var counter = 0; var result = new PerformanceAggregate(); var tasksResultList = new List <Tuple <PerformanceCounter, T> >(); var sw = new Stopwatch(); ThreadPool.SetMaxThreads(parallelism * 2, parallelism * 2); sw.Start(); /*Parallel.For(from, to, (i) => * { * tasksResultList.Add(task(i).Result); * iterrationAction(counter); * Interlocked.Increment(ref counter); * });*/ for (var i = from; i < to; i += parallelism) { var tasks = new Task[(i + parallelism) > to ? to - i : parallelism]; for (int pi = 0; pi < tasks.Length; pi++) { tasks[pi] = task(i + pi); } //ParallelTasks.StartAndWaitAllThrottledAsync(registerTasks, 1000).Wait(); Task.WaitAll(tasks); tasksResultList.AddRange(tasks.Cast <Task <Tuple <PerformanceCounter, T> > >().Select(_ => _.Result)); iterrationAction(counter); Interlocked.Add(ref counter, parallelism); } ; result.TotalElapsed = sw.Elapsed; result.PerformanceCounters = tasksResultList.Select(_ => _.Item1).ToArray(); return(Tuple.Create(result, tasksResultList.Select(_ => _.Item2).ToArray())); }
public PerformanceAggregate RegisterManyAccounts(int countAccounts, string accounLoginPrefix, bool useParallel) { if (useParallel) { return(DoParallelTasks(0, countAccounts, ParallelismFactor, async i1 => await RegisterAccount(string.Format("{0}{1}", accounLoginPrefix, i1)), counter => { if (counter % ParallelismFactor == 0) { Console.WriteLine("Registered {0} accounts", counter); } }).Item1); var res = new Tuple <PerformanceCounter, object> [countAccounts]; var sw = new Stopwatch(); sw.Start(); Parallel.For(0, countAccounts, async i1 => res[i1] = await RegisterAccount(string.Format("{0}{1}", accounLoginPrefix, i1))); var p = new PerformanceAggregate() { PerformanceCounters = res.Select(_ => _.Item1).ToArray(), TotalElapsed = sw.Elapsed }; return(p); } else { return(DoSequenceTask(0, countAccounts, i1 => RegisterAccount(string.Format("{0}{1}", accounLoginPrefix, i1)), i => { if (i % ParallelismFactor == 0) { Console.WriteLine("Registered {0} accounts", i); } }).Item1); } }
public Tuple <PerformanceAggregate, T[]> DoSequenceTask <T>(int from, int to, Func <int, Task <Tuple <PerformanceCounter, T> > > task, Action <int> iterrationAction) { var result = new PerformanceAggregate(); var tasksResultList = new List <Tuple <PerformanceCounter, T> >(); var sw = new Stopwatch(); sw.Start(); for (var i = from; i < to; i++) { tasksResultList.Add(task(i).Result); if (i % 256 == 0) { iterrationAction(i); } } result.TotalElapsed = sw.Elapsed; result.PerformanceCounters = tasksResultList.Select(_ => _.Item1).ToArray(); return(Tuple.Create(result, tasksResultList.Select(_ => _.Item2).ToArray())); }