var threads = 100;
var bag = new ConcurrentBag
var act = new List
var eachTaskChunkSize = (int)Math.Ceiling((float) nplIds.Keys.Count/(float) threads);
var subChunks = nplIds.Keys.SplitInChunks(eachTaskChunkSize).ToArray();
for (int i = 0; i < threads; i++)
{
var taskId = i;
var task = new Task(() =>
{
GetProductDetails( subChunks[taskId] ).ForEach(bag.Add);
});
task.Start();
act.Add(task);
}
Task.WaitAll(act.ToArray());