|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
16.10.2012, 15:02 | #1 |
Регистрация: 16.10.2012
Сообщений: 4
|
Не блокируется поток в клиент-серверном приложении (чат)
Всем доброго дня!
На лабораторной (да я студент) задали реализовать чат. В ходе реализации решил использовать асинхроный метод приема данных от клиента, и путём вызова событий обрабатыват их (например при приходе текстового сообщения от клиента вызывается событие getTextMs). Также на серверной части хранится список всех подключёных пользователей (для рассылки полученых сообщений). При любом обращении к списку пользователей я использую lock чтобы не вылететь из перечисления. Например когда пользователь выходит из сети, то вызывается функция которая удаляет его из списка, и если другой поток в это время рассылал данный - выходит не очень красиво. Собственно проблема - указаный элемент в lock не блокируется. И когда я запускаю к примеру сразу десять окон и одновременно их отключаю - сервер вылетает с InvalidOperationException Collection was modified; enumeration operation may not execute. (то есть у меня во время перечисления this.clientList изменился). Код:
serverMessage - сообщение, которое отправляется на клиент. serverClient.SendMessage - отправление текущего сообщения пользователю. Я сначала думал, что всё это каким-то чудом висит в одном потоке, но проверка по System.Threading.Thread.CurrentThre ad.ManagedThreadId показала разные числа (надеюсь то смотрел). также решил ради "шутки" добавить ещё одну переменную и посмотреть в дэбаге, при ошибке Код:
P.S. Пожалуйста, отзовитесь люди! Я уже второй день с этой ошибкой воюю... ='( |
16.10.2012, 17:33 | #2 |
Дружите с Linq ;)
Форумчанин
Регистрация: 15.10.2008
Сообщений: 822
|
Что есть clientList и как он объявлен. Как List<ServerClient>? Нужно обеспечить неизменность коллекции во време foreach, скопировав List в локальную переменную
Код:
Не давай организму поблажки, каждый день тренируй его в шашки..
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
проблемы в клиент серверном приложении | vangog | C# (си шарп) | 0 | 11.09.2011 19:59 |
Чат клиент-сервер | pavelslap | PHP | 0 | 06.12.2010 20:49 |
FibPlus в клиент-серверном приложении | Rusland | Работа с сетью в Delphi | 0 | 13.04.2010 14:04 |
Чат-клиент на С++ | VanHelsing | Общие вопросы C/C++ | 0 | 21.01.2010 10:23 |