2011-02-03 2 views
3

У меня есть службы WCF размещенных в службе окон, InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multipleслужбы WCF сваливания породить потоки

nettcp связывание, сконфигурированные с ListenBacklog = «512» и поведение обслуживания сконфигурированный с maxConcurrentCalls = "512"

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

Мой тестовый клиент использует автоматически сгенерированный прокси и выполняет 25 асинхронных вызовов в 25 потоках потоков. Хотя количество потоков медленно растет до всех 25, оно сразу порождает 10 потоков, а затем запускает дополнительный поток каждую секунду или около того. Сервер WCF генерирует 2-3 потока для обслуживания запросов. Работа, выполняемая функцией службы, занимает несколько сотен миллисекунд. Для завершения всех вызовов клиентов требуется около 20 секунд времени настенных часов.

Я профилированный сервер WCF и он проводит большую часть своего времени в ThreadStart_Context вызова WaitOne()

Может кто-нибудь сказать мне, почему его так медленно?

+0

Хорошо, похоже, что создание экземпляров 75 клиентов занимает много времени. Вот почему мой клиент не размножался нитями так быстро, как я думал. Это также влияло на любые вызовы служебных функций, выполненные за это время потоками, которые уже заданы его клиентами. Если я позволю ему создать все клиентские объекты, тогда начните звонить, он будет работать быстро. –

ответ

0

Я думаю, что причиной такого поведения является ThreadPool, который использует WCF. Он не слишком часто порождает темы (2 в секунду после достижения минимума). Таким образом, вы можете попытаться увеличить минимальный размер ThreadPool (сначала прочитайте о последствиях этого шага). Или вы можете проверить, можно ли использовать замену ThreadPool в этом случае.