Обработка пользовательских событий в классе из формы - PullRequest
0 голосов
/ 04 июля 2018

У меня проблемы с попыткой обработать событие, которое я создал. Я пытаюсь использовать WebSockets, и когда я получаю сообщение, я хочу вызвать событие, на которое может подписаться одна из моих форм.

В моем событии Form_Load. У меня есть:

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 имеет значение null, поэтому событие не вызывается. Как мне правильно обработать это событие?

1 Ответ

0 голосов
/ 05 июля 2018

MessageReceivedEvent не должно быть нулевым в этой точке:

MessageReceivedEvent?.Invoke(this, e);

когда вы добавили к нему слушателя, что вы написали в OnLoad:

taskRoutingServer.MessageReceivedEvent += TaskRoutingServer_MessageReceivedEvent1;

Это, вероятно, означает, что вы либо

  1. не вызывать событие в том же экземпляре (объект taskRoutingMessage в onLoad) или
  2. Вы в какой-то момент удалили слушателя.

Если "WebSocketBehaviour" каким-то образом автоматически создается платформой, это не будет тот же экземпляр. Тогда вы можете попробовать использовать статический обработчик событий:

    public static event MessageReceivedEventHandler MessageReceivedEvent;

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

... и установить его так в нагрузке:

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