Отправлять инструкции потоку, ожидающему TCP? - PullRequest
2 голосов
/ 14 декабря 2010

Я пытаюсь понять многопоточность в TCP, поэтому я кодирую основной текст telnet «маршрутизатор».

, используя ReadLine(), каждый поток, использующий прослушиватель TCP, будет ожидать ввода от telnetклиент, а затем ответить на основе текста, который отправляется.У меня это работает с несколькими потоками и несколькими клиентами telnet.

Я хочу условно отправлять сообщения всем потокам.Например, если текст, отправленный из какого-либо потока, называется «Оповещение!»тогда я хочу, чтобы каждый поток для подключенных клиентов выполнялся WriteLine("Alert!")

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

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

Вам нужно взглянуть на шаблон Event Broker. По сути, у вас будет один объект с событием, на которое подписываются все ваши потоки. Он также будет иметь метод, который можно вызвать, который вызовет событие. Это может звучать сложно, но довольно просто.

Пример кода здесь http://msforge.net/blogs/paki/archive/2007/11/20/EventBroker-implementation-in-C_2300_-full-source-code.aspx.

0 голосов
/ 14 декабря 2010

Не думайте о потоках как о данных. Думайте о них как о конструкциях.

Очевидно, чтобы класс A вызывал событие в классе B, B должен ссылаться на A и подписываться на его событие.

Но, честно говоря, я думаю, что вы поступаете неправильно. Имейте единственного слушателя TCP. Когда приходит сообщение, вы получаете объект веб-запроса и можете обрабатывать его в собственном потоке. При обработке потока, если вы найдете слово «Предупреждение», создайте событие для класса более высокого уровня. Затем обработайте событие и сделайте все, что нужно. Пример архитектуры:

Менеджер создает экземпляр TcpHandler и подписывается на его событие AlertReceived. TcpHandler создает экземпляр MessageProcessor и подписывается на его событие MessageReceived.

Когда TcpHandler читает что-то из своего объекта TcpListener, запускайте класс MessageProcessor и заставляйте его читать фактические данные в другом потоке.

Запустить событие MessageReceived. Затем в классе TcpHandler обработайте событие. Если полученные данные «Alert», инициируйте событие AlertReceived.

Класс Manager поймает событие и сделает все, что пожелаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...