Musisz zrozumieć użycie SemaphoreSlim

Oto kod, który mam, ale nie rozumiem, co robi SemaphoreSlim.

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
  }
}

Co czekass.WaitAsync(); & ss.Release(); robić?

Myślę, że jeśli uruchomię 50 wątków naraz, napisz kod jakSemaphoreSlim ss = new SemaphoreSlim(10); następnie będzie zmuszony do uruchomienia 10 aktywnych wątków na czas.

Gdy jeden z 10 wątków zakończy się, rozpocznie się inny wątek .... jeśli nie mam racji, pomóż mi zrozumieć przykładową sytuację.

Po co czekać z potrzebnym użyciemss.WaitAsync();? Co robiss.WaitAsync(); robić?

questionAnswers(2)

yourAnswerToTheQuestion