2 votes

Websocket-sharp ne déclenche pas l'événement OnOpen lors de l'ouverture du websocket

Je suis aux premiers stades de l'écriture d'un programme pour interagir avec une caméra IP. Un peu de code que j'ai écrit hier a fonctionné, mais quand je suis revenu ce matin, ça n'a pas marché. Je sais, j'ai probablement fait quelque chose, mais pour autant que je m'en souvienne, ça fonctionnait quand j'ai cliqué sur débogage avant de partir et ça ne fonctionnait pas quand j'ai cliqué sur débogage en revenant. J'ai même laissé mon ordinateur allumé avec VS en cours d'exécution toute la nuit (ce que je fais presque jamais, et j'ai redémarré depuis) pour pouvoir le trouver exactement comme je l'avais laissé. L'ordinateur était verrouillé, donc à moins qu'une personne très débrouillarde ait décidé de jouer avec moi, rien n'a changé pendant la nuit.

J'utilise websocket-sharp, et lorsque je me connecte au websocket (ce qui semble se passer avec succès), l'événement OnOpen n'est pas déclenché.

L'endroit où websocket-sharp déclenche l'événement se trouve dans les lignes suivantes.

private void open ()
{
  _inMessage = true;
  startReceiving ();
  try {
    OnOpen.Emit (this, EventArgs.Empty);
  }
  catch (Exception ex) {
    _logger.Error (ex.ToString ());
    error ("Une erreur s'est produite pendant l'événement OnOpen.", ex);
  }

Il atteint le OnOpen.Emit, et ne lance pas l'exception, donc il semble penser qu'il déclenche l'événement. L'événement est illustré ci-dessous

public event EventHandler OnOpen;

Il ne semble pas atteindre cette ligne car lorsque je mets un point d'arrêt là, il n'est pas en pause. Je n'ai jamais utilisé la méthode .Emit pour déclencher des événements avant, et je ne trouve pas grand-chose dans mes recherches, donc peut-être que quelque chose ne fonctionne pas là-bas?

Mon code est ci-dessous.

public Form1()
    {
        InitializeComponent();
        this.Shown += MainWindow_Loaded;
    }

    void MainWindow_Loaded(object sender, EventArgs e)
    {

        using (var ws = new WebSocket("ws://169.254.101.183"))
        {
            ws.OnMessage += (sender2, e2) =>
                textBox1.Text = e2.Data.ToString();

            ws.Connect();
            ws.OnOpen += (sender2,e2) =>
                textBox1.Text = "connecté";

            /*ws.OnError += (sender2, e2) =>
                textBox1.Text = e2.Message;*/

            //textBox1.Text = ".";
        }
    }

Y a-t-il une raison évidente pour laquelle OnOpen.Emit ne devrait pas déclencher effectivement l'événement OnOpen?

1voto

CHMaagaard Points 56

Dans la méthode MainWindow_Loaded, appelez-vous Connect avant de vous abonner à l'événement OnOpen.

Si vous vous abonnez à l'événement avant d'appeler Connect, alors textBox1.Text devrait être défini sur "connecté" après une connexion réussie.

0voto

Mortaly Points 8

Dans votre cas, la vraie raison est cette ligne

 using (var ws = new WebSocket("ws://169.254.101.183"))

Lorsque votre bloc se termine, l'objet 'ws' est fermé, y compris votre gestionnaire d'événements. Après un certain retard, vous recevez une réponse du WebSocket, mais le gestionnaire est déjà détruit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X