Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Распределённые приложения и сеть > Производительный сервер на C#


Автор: Leksey 17.4.2006, 22:09
Вот есть проблема: Многопользовательский сервер на C#.
Если бы писал на C++ использовал бы пул потоков и порты завершения для того чтобы не создавать на каждого клиента по потоку.
Как эту проблему решить на С#?

PS Вариант импортирования функций не предлагать. 

Автор: arilou 17.4.2006, 23:48
Цитата(Leksey @  17.4.2006,  22:09 Найти цитируемый пост)
Вот есть проблема: Многопользовательский сервер на C#.
Если бы писал на C++ использовал бы пул потоков и порты завершения для того чтобы не создавать на каждого клиента по потоку.
Как эту проблему решить на С#?

Асинхронный ввод/вывод на С# уже есть. Он реализуется с помощью методов Begin..., End.... Например, у сокета есть методы BeginReceive, EndReceive. Пул потоков тоже присутствует в виде класса ThreadPool. 

Для чего сервер-то?  

Автор: Leksey 18.4.2006, 13:20
Я про  BeginReceive...,  EndReceive знаю.
Сервер для компьютерной игры.
Решил делать так один поток на 5 клиентов с асинхронными сокетами на сервере и один дополнительный поток на клиенте. 

Автор: arilou 18.4.2006, 13:39
Цитата(Leksey @  18.4.2006,  13:20 Найти цитируемый пост)
Я про  BeginReceive...,  EndReceive знаю.

FYI, порты завершения -> в .NET это называется асинхронный ввод вывод -> BeginReceive, EndReceive.
 

Автор: vinegr 17.5.2006, 10:07
Коллеги, а можно поподробнее ?
у меня есть сервер на асинхронных сокетах, и я считал, что BeginReceive указывает call-back, который запускается по событию прихода данных, а выделение нити, в контексте которой выполняется call-back - дело системное и абсолютно непрозрачное.
Логирование показывает, что нити повторно используются, количество работающих нитей зависит от нагрузки на сервер - но как бы явно управлять этой механикой ?
(меня заинтриговала фраза 
Цитата

Решил делать так один поток на 5 клиентов с асинхронными сокетами на сервере 

как при использовании асинхронных сокетов ты будешь задавать, что вот эти 5 клиентов (сокетов) надо обслуживать вот этой нитью, а вот эти - другой нитью ? 

Автор: arilou 17.5.2006, 11:59
Цитата(vinegr @  17.5.2006,  10:07 Найти цитируемый пост)
количество работающих нитей зависит от нагрузки на сервер - но как бы явно управлять этой механикой 

Не уверен, что это возможно, т.к. overlapped I/O - это фича ОС. Хотя я не знаю, надо копать. 

Автор: Leksey 17.5.2006, 19:42
Это точно возможно на C++ и WinAPi.
А вот в .Net не уверен....  

Автор: arilou 18.5.2006, 12:14
Цитата(Leksey @  17.5.2006,  19:42 Найти цитируемый пост)
Это точно возможно на C++ и WinAPi.

Ага, тока речь идет о дотнете  smile  

Автор: Exception 18.5.2006, 18:27
Цитата(arilou @  18.5.2006,  13:14 Найти цитируемый пост)

Ага, тока речь идет о дотнете  


Кто-то отменил DllImport smile ? 

Автор: arilou 18.5.2006, 18:54
Цитата(Exception @  18.5.2006,  18:27 Найти цитируемый пост)
Кто-то отменил DllImport 

Ну ну. 

Автор: vinegr 26.5.2006, 17:15
Цитата(Leksey @  17.5.2006,  19:42 Найти цитируемый пост)
Это точно возможно на C++ и WinAPi.
А вот в .Net не уверен....  

штука не в том, чтобы поймать событие от overlapped I/O operation
штука в том, что очередь событий и механизм порождения нитей-обработчиков находятся где-то в недрах (я полагал, что в недрах исполняющей системы дотНета, но м.б. и в недрах WinAPi) - вот про это где бы почитать ? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)