c# - 从运行时创建的对象订阅事件

标签 c# events tcplistener

我有一个服务器类,当收到新连接时,它会在运行时创建一个 ClientHandler 对象。在 ClientHandler 内部,我需要在收到特定消息时触发 clientEvent。在我的 Form 类中,我引用了 Server 类,但我需要订阅 ClientHandler 对象中的 clientEvent。但是,该对象在设计时尚不存在。如何订阅?

我在订阅 clientEvent 的服务器中创建了一个事件处理程序,它引发了另一个 serverEvent。在 Form 类中,我订阅了 serverEvent。这样我就间接地监听了 clientEvent。但我相信有更好的方法来做到这一点。

public delegate void SomeEvent(string message);

public class Server
{
  public ClientHandler clientHandler;
  public event SomeEvent serverEvent;
  // callback function when new connection received
  public void on_connected()
  {
    clientHandler = new ClientHandler(...)
    clientHandler.clientEvent += ClientEventHandler;
    }
  public void ClientEventHandler(string message)
  {
    serverEvent?.Invoke(message)
  }
}

public class ClientHandler
{
  public event SomeEvent clientEvent;
  // callback when message is read
  void ReadCallback(...)
  {
    ...
    // Some message received
    clientEvent?.Invoke("Message received: " + someMessage);
  }

public partial class From1 : Form
{
  public Form1()
  {
   Server server = new Server(...);
   server.serverEvent += serverEventHandler;
   ...
  }
  private void serverEventHandler(string message)
  {
   // do something with message
  }
}

最佳答案

这种方法没有任何问题,只要您确保在移除 child 时取消订阅该事件即可。

这里是解决这个问题的 3 种主要方法

  1. 父级订阅子级事件,当子级取消订阅 em> 被移除
  2. 父级引用传递给子级,在父级上调用事件 em> 需要的时候。这可能会更整洁(有时)并且更易于管理。
  3. 通过事件聚合器之类的东西使用解耦消息传递,它将事件发布者转发到< em>订阅者。它们是分离的,因为它们不需要相互了解并且可以一起跳过父级

关于c# - 从运行时创建的对象订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55582363/

相关文章:

c# - 数据集值

c# - SerialPort DataReceived 事件线程

c# - 仅在 WCF Web 服务中需要某些方法的凭据

c++ - SDL2 pollevent() Controller d'pad 连续保持?

c# - HttpModule 中的异步事件处理程序

c# - 需要一个更优雅的模式来关闭 TcpListener

c# - 从 TCP 服务器向客户端发送多条消息(C sharp 到 Android)

C# 从数据库加载单词并将其添加到类型 "Choices"的列表中?

c# - 阻止代码并等待事件处理程序触发?

c# - 如果任务管理器中的内存使用量不断增加,如何知道是否是内存泄漏