using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Diagnostics;
private const int ITEMS_COUNT = 10;
private const int MAX_DEGREE_OF_PARALLELISM = 1;
private static readonly TimeSpan IODuration = TimeSpan.FromMilliseconds(10);
private static IDictionary<string, string> _database = new ConcurrentDictionary<string, string>();
public static void Main()
_database = new ConcurrentDictionary<string, string>();
var timer = Stopwatch.StartNew();
ValidateDatabase(_database);
Console.WriteLine("Sequencial: {0} ms", timer.ElapsedMilliseconds);
_database = new ConcurrentDictionary<string, string>();
timer = Stopwatch.StartNew();
ValidateDatabase(_database);
Console.WriteLine("Parallel Library: {0} ms", timer.ElapsedMilliseconds);
_database = new ConcurrentDictionary<string, string>();
timer = Stopwatch.StartNew();
ValidateDatabase(_database);
Console.WriteLine("Async Library: {0} ms", timer.ElapsedMilliseconds);
public static void Insert()
var list = GenerateItems();
var count = list.Count();
for (var i = 0; i < count; i++)
InsertInDatabaseAsync($"{i}", list.ElementAt(i)).GetAwaiter().GetResult();
public static void InsertBulkParallel()
var list = GenerateItems();
var count = list.Count();
var options = new ParallelOptions{MaxDegreeOfParallelism = MAX_DEGREE_OF_PARALLELISM};
Parallel.For(0, count, options, (i) =>
InsertInDatabaseAsync($"{i}", list.ElementAt(i)).GetAwaiter().GetResult();
public static void InsertBulkAsync()
var list = GenerateItems();
var count = list.Count();
ForEachAsync(list, (item, index) => InsertInDatabaseAsync($"{index}", item)).GetAwaiter().GetResult();
private static async Task InsertInDatabaseAsync(string index, string item)
await Task.Delay(IODuration);
private static IEnumerable<string> GenerateItems()
var list = new List<string>();
for (var i = 0; i < ITEMS_COUNT; i++)
list.Add($"{{\"id\":\"{i}\" }}");
private static void ValidateDatabase(IDictionary<string, string> dict)
if (dict.Count != ITEMS_COUNT)
throw new Exception("Items count wrong");
for(var i = 0; i < dict.Count; i++)
if(!dict.ContainsKey($"{i}"))
throw new Exception("Key not found");
private static async Task ForEachAsync<T>(IEnumerable<T> enumerable, Func<T, int, Task> asyncFunc)
var itemsCount = enumerable.Count();
var tasks = new Task[itemsCount];
foreach (var t in enumerable)
tasks[i] = asyncFunc(t, i);
await Task.WhenAll(tasks);