![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
Нужно создать что-то типа пула потоков внутри Win-сервиса. Пользователи будут подключаться к серверу, регистрироваться на нем, будет создаваться отдельный поток, а в нем сокет для дальнейшего обмена информацией... Соответственно на сервере должен быть список пользователей с ключами и информацией о пользователе, к примеру Dictionary<GUID,UserObject>... в случае необходимости отпраки сообщения по ключу, сервис обращается к нужному потоку и отправляет сообщения на нужный сокет...
В общем так мне видится реализация того чего хочу, но не разу не писал подобного, как реализовать подобное хранение потоков и обращение к ним??? |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
STRELOKBMSTU, посмотри в сторону класса ThreadPool камрад.
Добавлено через 1 минуту и 1 секунду подробнее |
|||
|
||||
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
Посмотрел ThreadPool, возможно он и подойдет, если увеличить максимальное число потоков, но мой вопрос скорее по организации регистрации и разрегистрации пользователей, т.е. как по ключу определить в каком именно потоке висит мой пользователь? и как в случае необходимости разрегистрировать пользователя на сервере опять же по ключу?
|
|||
|
||||
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
Разобрался с пулом, мне нужен не пул а обычный запуск каждого сокета в отдельном потоке, но как это все должно храниться, пока не ясно...
|
|||
|
||||
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
Можно ли создать как-нибудь список потоков?
|
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
в смысле - аля массив потоков? если необходимо - то конечно можно. используй те же коллекции. Добавлено через 4 минуты и 27 секунд но честно говоря теряюсь в догадках чем не подходит тот же ThreadPool.QueueUserWorkItem. |
|||
|
||||
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
Да я все никак не могу разобраться на каком этапе создавать новый поток, у меня слушается порт, соответственно сокет создается внутри самого сервиса а не в новом потоке... а чтобы он создавался в новом потоке, надо и слушать порт в отдельном потоке. Как организовать несколько висящих в памяти сокетов с регистрацией и разрегистрацией их? Вот немного текущего кода:
|
|||
|
||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
STRELOKBMSTU, посмотри msdn по TcpListener.BeginAcceptSocket
|
|||
|
||||
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
PashaPash, пасиб, интересная вещь, сейчас ознакомлюсь...
Это сообщение отредактировал(а) STRELOKBMSTU - 11.1.2010, 15:16 |
|||
|
||||
STRELOKBMSTU |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
все равно какая-то мутная картина в голове... ведь этот метод выполняется в том же потоке, в котором и был бызван, т.е. многопоточность не получается...
|
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 7 Всего: 306 |
да это обыкновенная асинхронная операция ожидающая входящее подключение. вообще кстати тов. Joseph Albahari советует использовать асинхронные методы в крайних случаях - заменив их использованием асинхронными делегатами. но это к слову.
я так понимаю работа идет с сервером. вообще классическая модель для сервера это использовать потоки + семафоры. |
|||
|
||||
tol05 |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Так называемая асинхронная модель программирования (Asynchronous Programming Model) В двух словах - есть рабочие потоки (Thread-ы, как мы привыкли их понимать) и потоки ввода-вывода (они еще называются потоками завершения) В стримах когда мы используем методы BeginХХХХ - мы активно используем потоки ввода\вывода, перекладывая тем самым часть нагрузки с процессора на драйвер устройства Об этом хорошо написал Рихтер в своей книге "CLR via C#". В главе о асинхронных операциях. Приведу две цитаты
О FileStream
Я могу ошибаться, но по-моему TcpListener.BeginAcceptSocket использует потоки ввода-вывода. Но даже если это не так.. то все равно, я бы любом случае использовал бы именно TcpListener.BeginAcceptSocket, а не создавал бы собственный (рабочий) поток. -------------------- На хорошей работе и сны хорошие снятся. |
||||
|
|||||
PashaPash |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
BeginAcceptSocket возвращает управление сразу после вызова. После подключения клиента вызывается Сallback, в отдельном потоке из пула. Т.е. каждому клиенту - свой поток. Все получается.
И чем он это мотивирует? ![]() |
||||
|
|||||
STRELOKBMSTU |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 138 Регистрация: 11.8.2007 Где: Russia.MR.Moscow( ); Репутация: нет Всего: нет |
Т.е. если одновременно придет много запросов от клиентов, они все встанут в очередь на CallBack или будут выполняться параллельно?
Да, и на BeginAcceptSocket цикл не зависает и не ждет события прихода сокета, а выполняется бесконечно, процесс конечно не сильно нагружается, но что-то не нравится этот бесконечный цикл:
Это сообщение отредактировал(а) STRELOKBMSTU - 11.1.2010, 18:31 |
||||
|
|||||
PashaPash |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Параллельно, на потоках из пула. Используй семафор для ограничения на количество одновременно висящих BeginAcceptSocket. Или используй синхронный AcceptSocket, но вынеси обработку в отдельный поток. У того же Joseph Albahari есть пример: http://www.albahari.com/nutshell/ch20.aspx |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |