Oto kod, który mam, ale nie rozumiem, co SemaphoreSlimrobi.
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 awaitpotrzebny wraz z ss.WaitAsync();? Co robi ss.WaitAsync();?