.NET Fiddle

CSharp · Console

/Program.cs

using System;
using System.Linq;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Diagnostics;

public class Program
{
	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();
		Insert();
		timer.Stop();
		ValidateDatabase(_database);
		Console.WriteLine("Sequencial: {0} ms", timer.ElapsedMilliseconds);
		
		_database = new ConcurrentDictionary<string, string>();
		timer = Stopwatch.StartNew();
		InsertBulkParallel();
		timer.Stop();
		ValidateDatabase(_database);
		Console.WriteLine("Parallel Library: {0} ms", timer.ElapsedMilliseconds);
		
		_database = new ConcurrentDictionary<string, string>();
		timer = Stopwatch.StartNew();
		InsertBulkAsync();
		timer.Stop();
		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);
		_database[index] = item;
	}

	private static IEnumerable<string> GenerateItems()
	{
		var list = new List<string>();
		for (var i = 0; i < ITEMS_COUNT; i++)
		{
			list.Add($"{{\"id\":\"{i}\" }}");
		}
		return list;
	}

	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++)
		{
			//Console.WriteLine($"dict[{i}] = {dict[i.ToString()]}");
			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];
		int i = 0;
		foreach (var t in enumerable)
		{
			tasks[i] = asyncFunc(t, i);
			i++;
		}
		await Task.WhenAll(tasks);
	}
}
;