Precisa entender o uso de SemaphoreSlim

Aqui está o código que tenho mas não entendo o que o SemaphoreSlim está fazendo.

async Task WorkerMainAsync()
{
  SemaphoreSlim ss = new SemaphoreSlim(10);
  List<Task> trackedTasks = new List<Task>();
  while (DoMore())
  {
    await ss.WaitAsync();
    trackedTasks.Add(Task.Run(() =>
              {
                DoPollingThenWorkAsync();
                ss.Release();
              }));
  }
  await Task.WhenAll(trackedTasks);
}

void DoPollingThenWorkAsync()
{
  var msg = Poll();
  if (msg != null)
  {
    Thread.Sleep(2000); // process the long running CPU-bound job
  }
}

O que esperass.WaitAsync(); & ss.Release(); Faz?

Eu acho que se eu executar 50 threads de cada vez, então escreva código comoSemaphoreSlim ss = new SemaphoreSlim(10); então será forçado a executar 10 threads ativos no momento.

Quando um dos 10 threads terminar, outro thread será iniciado ... se não estiver certo, ajude-me a entender com a situação da amostra.

Por que aguarda a necessidade de usar junto comss.WaitAsync();? O quess.WaitAsync(); Faz?

questionAnswers(2)

yourAnswerToTheQuestion