Вот код, который у меня есть, но я не понимаю, что 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();
делать?