none
Server - TaskFactory RRS feed

  • Frage


  • Hallo,
    return (new TaskFactory(token)).StartNew(Start);
     //return Task.Run(Start, token);
     //return Task.Run(() => Start(), token);


    Folgendes
    Ich habe einen Server
    Start und Stop Button.
    Bei Start -> Listen -> IO
    Bei Stop -> Stop -> IO
    Erneut Start -> geht nicht mehr.
    Warum? Wie kann die Lösung aussehen?
    Viele Grüße Olivertest a1
    Mittwoch, 16. August 2017 16:42

Antworten

  • Hi Oliver,
    ich hatte Dir doch auf Deine private Mail die Lösung geschickt. Hast Du Dir diese überhaupt angeschaut?

    Zuerst:

    TcpListenerServer.Stop();

    Damit wird das blockierende Warten abgebrochen. Und dann ist einfach der Fehler abzufangen:

            catch (SocketException ex)
            {
              if (ex.SocketErrorCode == SocketError.Interrupted)
                LogMessage(MessageTypes.Status, "A blocking listen has been cancelled");
              else
                LogMessage(MessageTypes.Error, ex.ToString());
            }
    LogMessage hat ich auch noch umgebaut, damit noch der Log-Typ angegeben wird.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 23. August 2017 15:35

Alle Antworten

  • Hi Oliver,
    die Fehlerausschrift "geht nicht mehr" ist mir völlig neu :-)

    Ich vermute, dass Deine Stop-Methode die Server-Instanz nicht entsorgt und damit den Port freigibt. Der Start einer weiteren Server-Instanz, die auf den gleichen Port horcht, geht natürlich nicht und wird mit einem eindeutigen Fehler abgebrochen, anders als "geht nicht mehr".

    Die Lösung sollte prinzipiell angegangen werden. Zu einem Zeitpunkt ist nur ein Server auf einem Port zulässig.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 17. August 2017 05:56
  • Hallo Peter,

    es kommt keine Exception. Start öffnet den Listener.

    Wie schließe ich den. OK mit Close, geht auch nicht.

    Grüße Oliver

    Donnerstag, 17. August 2017 08:26
  • Hallo Oliver,

    Socket des Servers  muss geschlossen werden. Wenn Du Accept im blockierenden Modus verwendest, bleibt dein Task da hängen.

    Donnerstag, 17. August 2017 13:41
  • Hallo,

    kann ich so jetzt nicht sagen.

    Es muss mit dem Token zu tun haben.

    Grüße Oliver

    Donnerstag, 17. August 2017 17:32
  • Hi Oliver,
    der Token in Deinem Beispiel bezieht sich auf den Task und hat mit TCP usw. nichts zu tun.

    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Donnerstag, 17. August 2017 19:19
  • Hallo Oliver,

    wenn Dein Server im blockierenden Modus arbeitet, also er wartet in der Accept Methode auf die Verbindungen, dann liegt das , wie Pater schon geschrieben hat, nicht an Tocken, sondern am Socket.  

    Viele Grüße

    Freitag, 18. August 2017 08:03
  • Hallo Iso7,

    sicher, aber wie würde man das richtig umsetzen?

    protected void AcceptMethod(Socket listeningSocket)
    {
     Socket mySocket = listeningSocket.Accept();
    }

    public void Start()
            {
                IPAddress ipAddre = IPAddress.Loopback;
                TcpListener listener;
                TcpListenerServer = new TcpListener(ipAddre, _listeningPort);
                TcpListenerServer.Start();
                EvHaContentReceived?.Invoke(this, "Listening on port " + _listeningPort);
    
                while (!MyToken.IsCancellationRequested)
                {
                    try
                    {
                        var tcpClient = TcpListenerServer.AcceptTcpClient();
                        TcpClientLLB = tcpClient;
                        HandleConnection(tcpClient);
                    }
                    catch (Exception exp)
                    {
                        TcpListenerServer.Stop();
                        Stop();
                        LogMessage(exp.ToString());
                        EvHaContentError?.Invoke(this, exp.Message);
                        throw exp;
                    }
                }
                TcpListenerServer.Stop();
            }

    Grüße Oliver


    Mittwoch, 23. August 2017 10:50
  • Hi Oliver,
    ich hatte Dir doch auf Deine private Mail die Lösung geschickt. Hast Du Dir diese überhaupt angeschaut?

    Zuerst:

    TcpListenerServer.Stop();

    Damit wird das blockierende Warten abgebrochen. Und dann ist einfach der Fehler abzufangen:

            catch (SocketException ex)
            {
              if (ex.SocketErrorCode == SocketError.Interrupted)
                LogMessage(MessageTypes.Status, "A blocking listen has been cancelled");
              else
                LogMessage(MessageTypes.Error, ex.ToString());
            }
    LogMessage hat ich auch noch umgebaut, damit noch der Log-Typ angegeben wird.


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP)
    Meine Homepage mit Tipps und Tricks

    Mittwoch, 23. August 2017 15:35