private static async Task <long[]> ProcessFibonacciWithTasks(long[] fibonacciNumbers, int numberOfTasks, ProcessingType processingType) { var tasks = new List <Task>(numberOfTasks); for (int i = 0; i < numberOfTasks; i++) { int taskIndex = i; //concurrency workaround for captured vars var task = new Task(() => CalculateFibonacci(fibonacciNumbers, numberOfTasks, taskIndex, processingType)); tasks.Add(task); } var watch = Stopwatch.StartNew(); tasks.ForEach(x => x.Start()); await Task.WhenAll(tasks); watch.Stop(); Console.WriteLine($"{numberOfTasks} Threads: {watch.ElapsedMilliseconds} milliseconds"); var numbers = ConcurrentStore.GetSortedNumbersFromStore(); ConcurrentStore.ClearStore(); return(numbers); }
public static void AddNumberAndCheckIfIsDone(long number) { ConcurrentStore.AddNumberToStore(number); Interlocked.Increment(ref _numbersProcessed); if (_numbersProcessed >= _numbersToProcess) { _stopWatch.Stop(); Console.WriteLine($"{_stopWatch.ElapsedMilliseconds} milliseconds"); var result = ConcurrentStore.GetSortedNumbersFromStore(); FileUtility.WriteNumbersToFile(OUTPUT_FILE, result); ConcurrentStore.ClearStore(); _numbersProcessed = 0; } }