none
C# WPF: Endlosschleife, zweites Fenster öffnen wenn Ereignis eintritt - Thread RRS feed

  • Frage

  • Hallo,

    ich bin dabei ein Programm fertig zu schreiben mit der ich Nachrichten an anderen Rechner(n) im Netzwerk schicken kann. Der Rechner am anderen Endpunkt wartet mit der Methode StartListener auf ankommende Nachrichten.

    Die grafische Oberfläche besteht aus einem Hauptfenster mit der ich Nachrichten schicken kann und einem Nebenfenster, das sich automatisch öffnet, wenn eine Nachricht ankommt.

    Das Problem liegt nun bei der Verwendung der Methode StartListener. Bei  mir sieht es abgeändert wie folgt aus:

           private void StartListener()
            {
                bool done = false;
    
                UdpClient listener = new UdpClient(listenPort);
                IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, port_nr);
    
                try
                {
                    while (!done)
                    {
                        byte[] bytes = udp_client.Receive(ref groupEP);
    
                        nachricht = new Nachricht();//Nebenfenster
                        nachricht.main_window_ref = this;
                        //Nachricht ausgeben
                        nachricht.TextBoxNachricht.Text = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
                        nachricht.ShowDialog();
                    }
    
                }
                catch (Exception e)
                {
                    nachricht.TextBoxNachricht.Text = e.ToString();
                }
                finally
                {
                    udp_client.Close();
                }
            }


    Nun gilt es, die Methode im Hintergrund laufen zu lassen, damit sie auf ankommende Nachrichten lauscht. Aber die Frage ist wo?

    Wenn ich sie in der "MainWindow" aufrufe, so wie folgt:

            public MainWindow()
            {
                InitializeComponent();
                StartListener();           
            }

    Bleibt mein Programm hängen, da die Methode eine Endlosschleife besitzt und aus der nicht rauskommt.

    Mir kam die Idee die Methode in einem neuen Thread laufen zu lassen:

            public MainWindow()
            {
                InitializeComponent();
                myThread = new Thread(StartListener);
                myThread.Start();           
            }

    Nun kann ich im Hauptfenster normal arbeiten und Nachrichten schicken. Allerdings öffnet sich das Nebenfenster zum empfangen der Nachrichten nicht wenn eine neue Nachricht ankommt. Was mache ich falsch oder was wären andere Lösungen zu diesem Problem?



    • Bearbeitet spry64 Sonntag, 27. September 2015 22:09 Verbesserung
    Sonntag, 27. September 2015 22:01

Antworten

  • Hi,
    das Instanziieren von Oberflächen-Objekten in anderen Threads als dem UI-Thread führt zu Problemen. Du solltest das Fenster im Haupt-Thread erzeugen, ggf. verstecken und bei Bedarf sichtbar machen. Dieses Sichtbarmachen sollten dann im Kontext des Haupt-Threads ausgeführt werden. Je nach Anwendungstyp kann man da Invoke, Dispatcher, SynchronzationContext.Post o.ä. genutzt werden.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks
    Kommas richtig setzen!
    Schüler sagen, Lehrer haben es gut.
    Schüler, sagen Lehrer, haben es gut

    Montag, 28. September 2015 05:59