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