Броадкастинг на .NET Remoting
От: nickstaves Украина  
Дата: 21.03.07 10:08
Оценка:
Приветствую!

Давно уже бьюсь над сабжем. Получилось почти все кроме отказоустойчивости.

Зачем это нужно — необходимо обновлять общую для клиентов информацию по инициативе сервера (или другого клиента). Например обновление списка цен на товары. Или нечто более интерактивное — обновление графиков загруженности производственных линий. Вощем с клиентов "пинговать" сервер в поиске изменившейся информации нерационально (на крайний случай).

С#

Идея проста — зарегистрировать на сервере Singleton объект (назовем класс Service) и в нем вызывать делегаты от клиентов.
Клиенты создавая у себя проксики серверного объекта вызывают например AddDelegate(Service.ServiceDelegate delegate) для добавления делегата с клиента.

Потом некая функция void Broadcast() в том же объекте Service вызывает все клиентские делегаты.

Столкнулся со следующей проблемой — при физическом обрыве соединения с клиентом (будь то проблемы с сетью или просто выключение компа клиента) попытка вызова клиентского делегата приводит к зависанию.

Переделал немного функцию Broadcast — чтобы все делегаты вызывались в своих потоках и все вроде заработало. Ессно заключил вызовы делегатов в try catch и при обнаружении ошибки этот делегат убирается из списка для дальнейших вызовов.

НО

Прочитал, что ремотинг использует для своей работы ThreadPool в кот по умолчанию 25 потоков. Насколько я понял каждый вызов делегата (успешный или нет) откусывает один поток и не отпускает его до окончания вызова.
Получаецца 25 раз появились проблемы с клиентом и все!?

Я понимаю что можно увеличить это число до 100 например, кроме того ремотинг вызовы не бесконечны и рано или поздно по таймауту они вылетают.
Но какой-же этот таймаут? Я ждал полтора часа и недождался. Может этим можно как-то управлять?

Или может быть можно заставить работать ремотинг с своем потоке?

Или может еще что-то?

С уважением
NickStaves
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.