代码之家  ›  专栏  ›  技术社区  ›  Jason Bayldon

从窗体处理类中的自定义事件

  •  2
  • Jason Bayldon  · 技术社区  · 6 年前

    尝试处理我创建的事件时遇到问题。我正在尝试使用websockets,当我收到消息时,我想引发一个事件,我的一个表单可以订阅该事件。

    以我的形式加载事件。我有:

    taskRoutingServer = new Core.WebSocketServerWrapper();
    taskRoutingServer.MessageReceivedEvent += 
    TaskRoutingServer_MessageReceivedEvent1;
    

    以我的形式,方法如下:

    private void TaskRoutingServer_MessageReceivedEvent1(object sender, WebSocketSharp.MessageEventArgs e)
    {
        throw new NotImplementedException();
    }
    

    我打算处理和使用“e”,它将包含我的表单需要处理的数据。我的WebSocket类如下所示:

    public class WebSocketServerWrapper : WebSocketBehavior
    {
      private WebSocketServer socketServer;
      public delegate void MessageReceivedEventHandler(object sender, MessageEventArgs e);
      public event MessageReceivedEventHandler MessageReceivedEvent;
      public string creator;
    
      public WebSocketServerWrapper()
      {
          socketServer = new WebSocketServer("ws://localhost:9001");
          socketServer.AddWebSocketService<WebSocketServerWrapper>("/ws");
      }
    
      public bool IsListening()
      {
          return socketServer.IsListening;
      }
    
      public void StartListening()
      {
          socketServer.Start();
      }
    
      public void StopListening()
      {
          socketServer.Stop();
      }
    
      protected override void OnMessage(MessageEventArgs e)
      {
          //invoke event
          MessageReceivedEvent?.Invoke(this, e);
      }
    }
    

    目前的行为是 OnMessage 开火,但是 MessageReceivedEvent 为空,因此不调用事件。如何正确处理此事件?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Stokke    6 年前

    此时,MessageReceivedEvent不应为空:

    MessageReceivedEvent?.Invoke(this, e);
    

    当你在onload中添加了一个监听器时:

    taskRoutingServer.MessageReceivedEvent += TaskRoutingServer_MessageReceivedEvent1;
    

    这可能意味着你要么

    1. 不在同一实例上触发事件(onload中的taskroutingmessage对象),或
    2. 你在某个时候删除了侦听器。

    如果“websocketbehavior”以某种方式由框架自动创建,那么它将不是同一个实例。然后可以尝试使用静态事件处理程序:

        public static event MessageReceivedEventHandler MessageReceivedEvent;
    
        protected override void OnMessage(MessageEventArgs e)
        {
            MessageReceivedEvent?.Invoke(this, e);
        }
    

    …然后把它装成这样:

    Core.WebSocketServerWrapper.MessageReceivedEvent += 
                                  TaskRoutingServer_MessageReceivedEvent1;