向正在等待TCP的线程发送指令?

时间:2010-12-14 01:25:51

标签: c# multithreading .net-4.0 tcp

我正在尝试理解TCP中的多线程,因此我编写了一个基本的telnet文本“router”。

使用ReadLine()每个线程使用TCP侦听器将等待来自telnet客户端的输入,然后根据发送的文本进行响应。我有多个线程和多个telnet客户端。

我想有条件地向所有线程发送消息。 例如,如果从任何一个线程发送的文本是“警告!”然后我希望连接客户端的每个线程都执行WriteLine("Alert!")

这有意义吗? 我的问题是我不知道如何让一个线程在另一个线程中引发一个事件。

2 个答案:

答案 0 :(得分:1)

您需要查看Event Broker模式。基本上你会有一个对象,其中包含所有线程订阅的事件。它还将有一个可以调用的方法来调用该事件。这可能听起来很复杂,但相当简单。

示例代码在这里http://msforge.net/blogs/paki/archive/2007/11/20/EventBroker-implementation-in-C_2300_-full-source-code.aspx

答案 1 :(得分:0)

不要将线程视为数据。将它们视为构造。

显然,如果A类在B类中引发一个事件,B必须引用A并订阅它的事件。

但说实话,我认为你的做法是错误的。有一个TCP侦听器。当有消息进入时,您将获得一个Web请求对象,您可以在其自己的线程中进行处理。处理线程时,如果找到“Alert”字样,则向更高级别的类生成事件。然后处理事件并做任何需要做的事情。示例架构:

Manager实例化TcpHandler并订阅其AlertReceived事件。 TcpHandler实例化MessageProcessor并订阅其MessageReceived事件。

当TcpHandler从其TcpListener对象中读取内容时,触发MessageProcessor类并让它读取另一个线程上的实际数据。

触发MessageReceived事件。然后在TcpHandler类中处理事件。如果收到的数据是“警报”,则触发AlertReceived事件。

Manager类将捕获事件并执行您想要的任何其他操作。