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

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

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

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

Спасибо

Steve

Ответы [ 4 ]

19 голосов
/ 31 марта 2010

Использовать семафор

http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx

Ограничивает количество потоков, которые могут получить доступ к ресурсу или пулу ресурсов одновременно.

11 голосов
/ 31 марта 2010

Вы хотите семафор ... 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)]
1 голос
/ 31 марта 2010

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

1 голос
/ 31 марта 2010

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

...