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

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

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

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

Спасибо,

Steve

15
задан Steve Whitfield 31 March 2010 в 10:48
поделиться

4 ответа

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

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

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

19
ответ дан 1 December 2019 в 01:53
поделиться

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

1
ответ дан 1 December 2019 в 01:53
поделиться

Вам нужен семафор ... 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 также предоставляет концептуальный эквивалент с атрибутом synchronized Java:

[System.Runtime.CompilerServices.MethodImpl(MethodImpl.Synchronized)]
11
ответ дан 1 December 2019 в 01:53
поделиться

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

1
ответ дан 1 December 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: