public Vector <double> RunCalculations(RandomSource random, int iterations, Func <int, double, double> sampleFunction) { if (random == null) { throw new ArgumentNullException(nameof(random)); } else if (iterations % ChunkSize != 0) { throw new ArgumentException($"Iteration count must be a multiple of {ChunkSize}.", nameof(iterations)); } SampleFunction = sampleFunction; int numberOfChunks = iterations / ChunkSize; results = Vector <double> .Build.Dense(iterations); var randomNumberBuffer = new BufferBlock <(int chunkNumber, double[] randomNumbers)>(); var calculationBlock = new ActionBlock <(int chunkNumber, double[] randomNumbers)>(DoCalculation, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = -1 }); randomNumberBuffer.LinkTo(calculationBlock, new DataflowLinkOptions() { PropagateCompletion = true }); for (int i = 0; i < numberOfChunks; i++) { double[] randomArray = new double[ChunkSize]; random.NextDoubles(randomArray); randomNumberBuffer.Post((i, randomArray)); } randomNumberBuffer.Complete(); calculationBlock.Completion.Wait(); return(results); }