Что касается обсуждения комментариев, проблема в том, что ваш семафор выходит из области видимости.У вас есть два варианта:
a) Ожидать выполнения всех задач внутри блока
using (var throttler = new SemaphoreSlim(degreeOfParallelism))
{
// setup the tasks
try
{
await Task.WhenAll(tasks);
}
// ...
}
b) Утилизировать вручную после завершения выполнения всех задач
var throttler = new SemaphoreSlim(degreeOfParallelism)
{
// setup the tasks. You can still use a scope block (brackets) here if you want.
}
try
{
await Task.WhenAll(tasks);
// ...
}
finally
{
throttler?.Dispose()
}
Второй вариант, скорее всего, будет более подходящим, но он зависит от окончательной компоновки вашего кода.