public static void Main(string[] args)
int[] factorials = { 3, 4, 5, 1, 3, 4, 5, 1, 3, 4, 5, 1, 3, 4, 5, 1, 3, 4 };
CountFactorial countFactorial = new CountFactorial(factorials);
DateTime timeStart = DateTime.Now;
countFactorial.SetSumFactorialByOneThread();
DateTime timeEnd = DateTime.Now;
countFactorial.SetSumFactorialByThreads();
DateTime timeEnd2 = DateTime.Now;
Console.WriteLine(string.Format("Normal sum = {0}, time = {1} ns", countFactorial.firstWayCount, timeEnd - timeStart));
Console.WriteLine(string.Format("Threaded sum = {0}, time = {1} ns", countFactorial.secondWayCount, timeEnd2 - timeEnd));
private int[] factorials;
public int firstWayCount;
public int secondWayCount;
public CountFactorial(int[] factorials)
this.factorials = factorials;
public void SetSumFactorialByOneThread()
firstWayCount = GetSumFactorial(factorials);
public void SetSumFactorialByThreads()
var arr1 = factorials.Take(rangeArr1).ToArray();
var arr2 = factorials.Skip(rangeArr1).Take(rangeArr2).ToArray();
var arr3 = factorials.Skip(rangeArr1 + rangeArr2).Take(rangeArr3).ToArray();
var arr4 = factorials.Skip(rangeArr1 + rangeArr2 + rangeArr3).Take(rangeArr4).ToArray();
public void StartTheThread(int[] factorials)
Thread thread = new Thread(() => { secondWayCount += GetSumFactorial(factorials); });
private int GetSumFactorial(int[] factorials)
foreach (int factorialLength in factorials)
for (int i = 1; i <= factorialLength; i++)