public static long SpinParallel(long millisecondsToRun, Action funcToTest)
{
Task<long>[] tasks = new Task<long>[Environment.ProcessorCount];
for(int i = 0; i < Environment.ProcessorCount; i++)
{
tasks[i] = new Task<long>(() => Spin(millisecondsToRun, funcToTest));
}
DateTime start = DateTime.UtcNow;
tasks.ForEach(task => task.Start());
// ReSharper disable once CoVariantArrayConversion
Task.WaitAll(tasks);
long ranMillisec = (long)(DateTime.UtcNow - start).TotalMilliseconds;
Debug.WriteLine("Parallel call counting run time mismatch is {0:#,#} milliseconds.", ranMillisec - millisecondsToRun);
long[] runCounts = tasks.Select(thread => thread.Result).ToArray();
long total = runCounts.Sum();
return total;
}