I created the following method TestThrottled to try throttle my tasks, but it is not throttling at all, when I call WhenAll and this method both have equivalent elapsed time. Am I doing anything wrong?
private static async Task<T[]> TestThrottled<T>(List<Task<T>> tasks, int maxDegreeOfParallelism)
{
var semaphore = new SemaphoreSlim(maxDegreeOfParallelism);
var tasksParallelized = new List<Task<T>>();
foreach (var task in tasks)
{
var taskParallelized = Task.Run(async () =>
{
try
{
await semaphore.WaitAsync();
return await task;
}
finally
{
semaphore.Release();
}
});
tasksParallelized.Add(taskParallelized);
}
return await Task.WhenAll(tasksParallelized);
}
private static async Task<int> TestAsync()
{
await Task.Delay(1000);
return 1;
}
static async Task Main(string[] args)
{
var sw = Stopwatch.StartNew();
var tasks = new List<Task<int>>();
var ints = new List<int>();
for (int i = 0; i < 30; i++)
{
tasks.Add(TestAsync());
}
ints.AddRange(await TestThrottled(tasks, 1));
Console.WriteLine($"{sw.ElapsedMilliseconds}, count: {ints.Count}");
Console.ReadLine();
}