Подтвердить что ты не робот

Ограничение количества потоков, выполняющих метод за один раз

У нас есть ситуация, когда мы хотим ограничить количество запросов Paralell, которые наше приложение может внести на сервер приложений. У нас есть потенциально более 100 фоновых потоков, которые захотят в какой-то момент сделать вызов серверу приложений, но только хотят, чтобы 5 потоков могли одновременно вызвать SendMessage() (или каким бы то ни было способом). Каков наилучший способ достижения этого?

Я рассмотрел использование какого-то объекта гейткипера, который блокирует потоки, входящие в этот метод, до тех пор, пока количество выполняемых в нем потоков не упадет ниже порога. Будет ли это разумным решением, или я не замечаю, что это может быть грязным/опасным?

Мы разрабатываем в С#.NET 3.5.

Спасибо,

Стив

4b9b3361

Ответ 2

Вы хотите семафор... System.Threading.Semaphore

public static class MyClass
{
    private static Semaphore sem = new Semaphore(5, 5);

    public static void SendMessage()
    {
        sem.WaitOne();

        try
        {
        }
        finally
        {
            sem.Release(1);
        }
    }
}

В качестве альтернативы, если вы хотите, чтобы только один поток мог вызвать метод в данный момент времени,.NET также предоставляет эквивалент концепции с атрибутом java synchronized:

[System.Runtime.CompilerServices.MethodImpl(MethodImpl.Synchronized)]

Ответ 3

Класс Semaphore был разработан именно для этого сценария.

Ответ 4

Подход к шаблону проектирования: - Использовать шаблон команды с пятью потоками Executor и обернуть ваши запросы в командных классах.