SemaphoreSlim не вращается до максимального количества потоков - PullRequest
0 голосов
/ 02 октября 2019

Я думал, что понял SemaphoreSlim, но думаю, что мне нужна помощь. Если я объявляю семафор с maxCount, равным 2, то я предполагал, что количество семафоров будет увеличиваться до 2 с каждым вызовом WaitAsync () в цикле, позволяя одновременно запускать до двух задач, но он выполняется толькопо одному, хотя я выпускаю Семафор в конце каждого задания. Может кто-нибудь пролить свет на то, почему этот код запускает одну задачу за раз?

class Program
{
    static SemaphoreSlim _loopThrottle = new SemaphoreSlim(1, 2);

    static async Task Main(string[] args)
    {
        for (int taskID = 1; taskID <= 10; taskID++)
        {
            await _loopThrottle.WaitAsync();
            var t = SomeFunctionAsync(taskID);
        }
        Console.ReadLine();
    }

    private async static Task SomeFunctionAsync(int taskID)
    {
        await Task.Delay(1000);
        Console.WriteLine(taskID);
        _loopThrottle.Release();
    }
}

1 Ответ

0 голосов
/ 02 октября 2019

Вы неправильно поняли параметры конструктора SemaphoreSlim, initialCount должен быть равен 2. Вы утверждаете, что один из двух доступных «слотов» недоступен (ваш .CurrentCount будет равен 1 в начале). Поскольку остается только один запрос, ваш цикл не может запускать задачи SomeFunctionAsync () с большей скоростью, чем по одному за раз. Поскольку каждый из них только Release () один раз, вы никогда не освобождаете два слота, которые вы объявили как maxCount.

...