Ось код, який я маю, але я не розумію, що 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
}
}
Що чекає ss.WaitAsync();
і ss.Release();
робить?
Я думаю, якщо я запустив 50 потоків одночасно, тоді напишу код, як SemaphoreSlim ss = new SemaphoreSlim(10);
тоді, він буде змушений запустити 10 активних потоків одночасно.
Коли один із 10 потоків завершиться, почнеться інший. Якщо я не правий, то допоможіть мені зрозуміти ситуацію зі зразками.
Навіщо await
потрібно поряд з ss.WaitAsync();
? Що робить ss.WaitAsync();
?