C # Сервер Распределение потоков - PullRequest
3 голосов
/ 14 июня 2011

Я пишу сервер, который должен обслуживать большое количество клиентов.Я рассматриваю, какую стратегию потоков лучше всего использовать: я прочитал, что класс ThreadPool в .NET Framework распределяет потоки после учета таких параметров, как число ядер, на которых работает машина, и это здорово.Однако, если нет доступного потока, он ждет, пока он не станет доступным.

Соединения в моих сокетах могут быть довольно длинными, то есть поток может работать довольно долго, прежде чем он завершит обслуживание своего клиентатерминатор.Поэтому, если я запускаю новый поток для каждого сокета, теоретически возможно, что большое количество потоков будет простаивать (ожидая данных в сокете), но все еще считается работающим, и, таким образом, ThreadPool не сможетвыделение новых потоков и обслуживание других клиентов.С другой стороны, использование предварительно определенного числа потоков для обслуживания всех сокетов не позволяет оптимально использовать несколько ядер машины.

Я предполагаю, что есть лучший способ сделать это ... Есть предложения?

Спасибо.

Ответы [ 4 ]

4 голосов
/ 14 июня 2011

Вы хотите использовать асинхронные сокеты . Они используют пул потоков, но не используют потоки во время ожидания данных в сокете (то есть они не блокируют).

0 голосов
/ 14 июня 2011

Я очень рекомендую это видео, Джеффри Рихтер рассказывает об общей многопоточности и пулах потоков. Он также упоминает лучшие стратегии для многопоточности сервера

0 голосов
/ 14 июня 2011

.NET ThreadPool намного умнее этого. Я бы рекомендовал использовать либо Task/TaskScheduler framework, либо модель APM соответствующих классов FCL. Это почти наверняка превзойдет любую стратегию создания потоков вручную - если вы не придумали такую, которая превосходит все ...

0 голосов
/ 14 июня 2011

Не распределяйте темы самостоятельно.Использовать IIS или службу активации Windows: http://msdn.microsoft.com/en-us/library/ms733109.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...