【问题标题】:Sending instructions to a thread which is waiting for TCP?向等待 TCP 的线程发送指令?
【发布时间】:2011-05-25 00:30:43
【问题描述】:

我正在尝试理解 TCP 中的多线程,所以我正在编写一个基本的 telnet 文本“路由器”。

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

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

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

【问题讨论】:

    标签: c# multithreading .net-4.0 tcp


    【解决方案1】:

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

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

    【讨论】:

    • 是的,这是一个很好的开始,谢谢!现在有下期为每个线程执行writeline...
    • 这应该很容易在订阅事件的事件处理程序中完成。
    • 任何指针?问题是 telnet 会话基本上都在 readline... 我将如何从事件处理程序在同一个套接字中执行 writeline?我在想我可能需要创建静态套接字?
    • 好点...一种方法是让您的 ReadLine() 调用在一个可以中断的 while 循环内,有点像 while(noEvents) 而不是 while(true)。这样,您可以在触发事件时设置 noEvents = false,这将中断您的循环,因此您可以调用 WriteLine,然后您将 noEvents 设置回 true 并返回您的循环。
    • 好的,所以我不能中断ReadLine(),因为循环永远不会经过它到达while(noEvents).....我解决它的方法是将StreamWriter暴露给另一个线程,不管StreamReader被卡住了,它都可以写它想要的一切
    【解决方案2】:

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

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

    但老实说,我认为你的做法是错误的。有一个 TCP 侦听器。当消息进来时,你会得到一个 web 请求对象,你可以在它自己的线程中处理。在处理线程时,如果您发现单词“Alert”,则向更高级别的类生成一个事件。然后处理事件并做任何需要做的事情。示例架构:

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

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

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

    Manager 类会捕捉到事件并做任何你想做的事情。

    【讨论】:

    • 如果您正在运行 telnet 会话,则需要保持连接打开,并且必须在其自己的线程中完成与每个客户端的对话。 n 个客户端等于 n 个线程,每个线程都有自己的侦听器,等待来自客户端的输入。
    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    相关资源
    最近更新 更多