Приветствую!
Давно уже бьюсь над сабжем. Получилось почти все кроме отказоустойчивости.
Зачем это нужно — необходимо обновлять общую для клиентов информацию по инициативе сервера (или другого клиента). Например обновление списка цен на товары. Или нечто более интерактивное — обновление графиков загруженности производственных линий. Вощем с клиентов "пинговать" сервер в поиске изменившейся информации нерационально (на крайний случай).
С#
Идея проста — зарегистрировать на сервере Singleton объект (назовем класс Service) и в нем вызывать делегаты от клиентов.
Клиенты создавая у себя проксики серверного объекта вызывают например AddDelegate(Service.ServiceDelegate delegate) для добавления делегата с клиента.
Потом некая функция void Broadcast() в том же объекте Service вызывает все клиентские делегаты.
Столкнулся со следующей проблемой — при физическом обрыве соединения с клиентом (будь то проблемы с сетью или просто выключение компа клиента) попытка вызова клиентского делегата приводит к зависанию.
Переделал немного функцию Broadcast — чтобы все делегаты вызывались в своих потоках и все вроде заработало. Ессно заключил вызовы делегатов в try catch и при обнаружении ошибки этот делегат убирается из списка для дальнейших вызовов.
НО
Прочитал, что ремотинг использует для своей работы ThreadPool в кот по умолчанию 25 потоков. Насколько я понял каждый вызов делегата (успешный или нет) откусывает один поток и не отпускает его до окончания вызова.
Получаецца 25 раз появились проблемы с клиентом и все!?
Я понимаю что можно увеличить это число до 100 например, кроме того ремотинг вызовы не бесконечны и рано или поздно по таймауту они вылетают.
Но какой-же этот таймаут? Я ждал полтора часа и недождался. Может этим можно как-то управлять?
Или может быть можно заставить работать ремотинг с своем потоке?
Или может еще что-то?
С уважением
NickStaves