using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
public static void Main()
Console.WriteLine("Hello World");
Tester tester = new Tester();
ConcurrentStack<int> values = new ConcurrentStack<int>();
int threadsPerProcessor = 1;
int maxParallelism = (Environment.ProcessorCount * threadsPerProcessor) /2;
RunAsParallel(number, maxParallelism);
void RunAsTasks(int number)
Stopwatch sw = new Stopwatch();
var calcs = GetCalcTasks(number).ToArray();
int total = values.Sum();
Console.WriteLine("Total = " + total);
Console.WriteLine("Elapsed, Tasks = " + sw.Elapsed);
void RunAsParallel(int number, int maxParallelism = -1)
Stopwatch sw = new Stopwatch();
var calcs = GetCalcs(number).ToArray();
ParallelOptions options = new ParallelOptions() {
MaxDegreeOfParallelism = maxParallelism
Parallel.ForEach(calcs, options, c => {
int total = values.Sum();
Console.WriteLine("Total = " + total);
Console.WriteLine("Elapsed, Parallel = " + sw.Elapsed);
List<Calc> GetCalcs(int number) {
List<Calc> result = new List<Calc>(number);
for(var i=0; i<number; i++)
List<Task> GetCalcTasks(int number) {
List<Task> tasks = new List<Task>(number);
var calcs = GetCalcs(number);
for (int i = 0; i < number; i++)
private static int _Index = default;
public int Index {get; private set;}
Random r = new Random(_Index);
_Result = r.Next(1, 12000);
Slow(TimeSpan.FromSeconds(1));
public void Slow(TimeSpan span)
var end = DateTime.Now + span;
while (DateTime.Now < end)