using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
private static readonly List<int> codes = new List<int>();
public static void Main(string[] args)
for (int i = 0; i < 200; i++)
var processor = new ConcurrentCalculationProcessor(codes);
var data = Task.Run(async () => await processor.Execute()).GetAwaiter().GetResult();
public class ConcurrentCalculationProcessor
private const int MAX_CONCURRENT_TASKS = 4;
private readonly IEnumerable<int> _codes;
private readonly List<Task<Dictionary<string, CalculationResult>>> _tasks;
private readonly Dictionary<string, CalculationResult> _combinationsReal;
public ConcurrentCalculationProcessor(IEnumerable<int> codes)
this._tasks = new List<Task<Dictionary<string, CalculationResult>>>();
this._combinationsReal = new Dictionary<string, CalculationResult>();
private async Task<Dictionary<string, CalculationResult>> ProcessCombinations()
Dictionary<string, CalculationResult> combinations = new Dictionary<string, CalculationResult>();
for (int i = 0; i < 100; i++)
combinations[i.ToString()] = new CalculationResult(new decimal[] { 1, 10, 15 });
return await Task.FromResult(combinations);
public async Task<Dictionary<string, CalculationResult>> Execute()
ConcurrentBag<Dictionary<string, CalculationResult>> results = new ConcurrentBag<Dictionary<string, CalculationResult>>();
for (int i = 0; i < this._codes.Count(); i++)
var task = ProcessCombinations();
if (this._tasks.Count() >= MAX_CONCURRENT_TASKS)
await ProcessRealCombinations().ConfigureAwait(false);
while (this._tasks.Any())
await ProcessRealCombinations().ConfigureAwait(false);
return this._combinationsReal;
private async Task ProcessRealCombinations()
var completedTasks = this._tasks.Where(t => t.IsCompleted).ToArray();
foreach (var completedTask in completedTasks)
var processedCombinations = await completedTask.ConfigureAwait(false);
foreach (var pair in processedCombinations)
if (this._combinationsReal.ContainsKey(pair.Key))
this._combinationsReal[pair.Key].Update(pair.Value);
this._combinationsReal.Add(pair.Key, pair.Value);
this._tasks.Remove(completedTask);
public class CalculationResult
public int Count { get; set; }
public decimal[] RunningTotals { get; set; }
public CalculationResult(decimal[] profits)
this.RunningTotals = new decimal[12];
profits.CopyTo(this.RunningTotals, 0);
public void Update(decimal[] newData)
for (int i = 0; i < 12; i++)
this.RunningTotals[i] = this.RunningTotals[i] + newData[i];
public void Update(CalculationResult otherResult)
this.Count += otherResult.Count;
for (int i = 0; i < 12; i++)
this.RunningTotals[i] = this.RunningTotals[i] + otherResult.RunningTotals[i];