Ответ 1
Использование семафора
http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx
Ограничивает количество потоков, которые могут доступ к ресурсу или пулу ресурсов одновременно.
У нас есть ситуация, когда мы хотим ограничить количество запросов Paralell, которые наше приложение может внести на сервер приложений. У нас есть потенциально более 100 фоновых потоков, которые захотят в какой-то момент сделать вызов серверу приложений, но только хотят, чтобы 5 потоков могли одновременно вызвать SendMessage() (или каким бы то ни было способом). Каков наилучший способ достижения этого?
Я рассмотрел использование какого-то объекта гейткипера, который блокирует потоки, входящие в этот метод, до тех пор, пока количество выполняемых в нем потоков не упадет ниже порога. Будет ли это разумным решением, или я не замечаю, что это может быть грязным/опасным?
Мы разрабатываем в С#.NET 3.5.
Спасибо,
Стив
Использование семафора
http://msdn.microsoft.com/en-us/library/system.threading.semaphore.aspx
Ограничивает количество потоков, которые могут доступ к ресурсу или пулу ресурсов одновременно.
Вы хотите семафор... 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)]
Класс Semaphore был разработан именно для этого сценария.
Подход к шаблону проектирования: - Использовать шаблон команды с пятью потоками Executor и обернуть ваши запросы в командных классах.