Что происходит при использовании делегатов в C # .Net, когда у меня заканчиваются потоки в пуле потоков .Net? - PullRequest
2 голосов
/ 22 ноября 2010

Я создаю многопоточное приложение, использующее делегаты для обработки запросов в службе WCF.Я хочу, чтобы клиенты могли отправлять запрос, а затем отключаться и ждать обратного вызова, чтобы объявить о работе (которая, скорее всего, будет искать в базе данных).Я не знаю, сколько запросов может приходить одновременно, это может быть один раз в какое-то время, или это может увеличиться до десятков.

Насколько я знаю, пул потоков .Net имеет 25 потоков, доступных дляиспользовать.Что происходит, когда я порождаю 25 или более делегатов?Выдает ли это ошибку, ждет ли она, приостанавливает ли существующую операцию и начинает ли работать с новым делегатом, или как-то иначе?

Помимо этого, что произойдет, если я захочу порождать до или более25 делегатов, в то время как другие операции (такие как входящие / исходящие соединения) хотят начать, и / или когда другая операция работает, и я хочу порождать другого делегата?

Я хочу убедиться, что это масштабируется, не слишкомкомплекс.

Спасибо

Ответы [ 4 ]

4 голосов
/ 22 ноября 2010

Все операции поставлены в очередь (я предполагаю, что вы используете пул потоков прямо или косвенно).Работа пула потоков состоит в том, чтобы перебирать очередь и отправлять операции в потоки.В конечном итоге все потоки могут стать занятыми, что будет означать, что очередь будет увеличиваться до тех пор, пока потоки не начнут обрабатывать поставленные в очередь рабочие элементы.

3 голосов
/ 22 ноября 2010

Вы путаете делегатов с потоками и количеством одновременных соединений.

При двухсторонних привязках WCF соединение остается открытым во время ожидания обратного вызова. IIS 7 или более поздней версии, на современном оборудовании не должно быть проблем с поддержанием нескольких тысяч одновременных соединений, если они бездействуют.

Делегаты - это просто указатели на методы - вы можете иметь столько, сколько пожелаете. Это не значит, что их вызывают одновременно.

1 голос
/ 22 ноября 2010

ThreadPools по умолчанию максимальное количество потоков 250, а не 25! Вы все еще можете установить более высокий предел для ThreadPool, если вам это нужно.
Если в вашем ThreadPool заканчиваются потоки, могут произойти две вещи: Все операции помещаются в очередь до тех пор, пока не будет доступен следующий ресурс. Если есть готовые потоки, они все еще могут быть «использованы», поэтому GC сработает и освободит некоторые из них, предоставив вам новые ресурсы. Однако вы также можете создавать темы, не используя ThreadPool.

1 голос
/ 22 ноября 2010

Если вы используете ThreadPool.QueueUserWorkItem, то он просто ставит в очередь дополнительные элементы, пока не станет доступен поток.

...