Oto kod, który mam, ale nie rozumiem, co SemaphoreSlim
robi.
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 czeka ss.WaitAsync();
i co ss.Release();
robi?
Wydaje mi się, że jeśli uruchomię 50 wątków na raz, a potem napiszę kod w SemaphoreSlim ss = new SemaphoreSlim(10);
ten sposób, będzie zmuszony do uruchomienia 10 aktywnych wątków na raz.
Gdy jeden z 10 wątków zostanie zakończony, rozpocznie się kolejny wątek. Jeśli nie mam racji, pomóż mi zrozumieć przykładową sytuację.
Dlaczego jest await
potrzebny wraz z ss.WaitAsync();
? Co robi ss.WaitAsync();
?