System.IO.IOException-Ausnahme beim Versuch zu Ende-thread

Ich Lerne netcode und multithreading in Monodevelop unter Verwendung von C# mit GTK#. Hab ich nie gemacht vorher, und jetzt finde ich mich brauchen, um beides auf einmal.

Ich habe eine tutorial-chat-Programm, das keine Handhabung von Fehlern, und das habe ich gefangen, dass ein Fehler passiert, in der client jedes mal, wenn ich vom server getrennt. Der code sitzt in einem thread auf eingehende Nachrichten warten, ist wie folgt, umgeben von try/catch-Anweisungen:

            try
        {
            while (Connected)
            {
                if (!srReceiver.EndOfStream && Connected)
                {
                    string temp = srReceiver.ReadLine();
                    //Show the messages in the log TextBox
                    Gtk.Application.Invoke(delegate
                    {
                        UpdateLog(temp);
                    });
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.ToString());   
        }

Nach dem die Funktion beendet und der thread beendet.

Den code, endet die Verbindung sieht so aus und läuft auf dem main thread:

        private void CloseConnection(string Reason)
    {
        //Show the reason why the connection is ending
        UpdateLog(Reason);
        //Enable and disable the appropriate controls on the form
        txtIp.Sensitive = true;
        txtUser.Sensitive = true;
        txtMessage.Sensitive = false;
        btnSend.Sensitive = false;
        btnConnect.Label = "Connect";

        //Close the objects
        Connected = false;
        swSender.Close();
        srReceiver.Close();
        tcpServer.Close();
    }

Und der try/catch-Anweisungen über Fang dieser Fehler:

System.IO.IOException: Unable to read data from the transport
Verbindung: Ein blockierungsvorgang wurde unterbrochen durch einen Aufruf von
WSACancelBlockingCall. ---> System.Net.Sockets.SocketException: Ein
blockierende operation wurde unterbrochen durch einen Aufruf von WSACancelBlockingCall

System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset,
Int32 size, SocketFlags socketFlags)

System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32
offset, Int32 size)

--- Ende der inneren Ausnahme-stack-trace - - -

System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32
offset, Int32 size)

System.IO.StreamReader.ReadBuffer()

System.IO.StreamReader.get_EndOfStream()

in ChatClientGTK.MainWindow.ReceiveMessages() in
g:\Android\Tutes\ChatClientRemake\ChatClientGTK\MainWindow.cs:Zeile 157

Nun, soweit ich das beurteilen kann, wenn srReciever.Close() geschieht in der main-thread, srReciever.ReadLine() ist immer noch versuchen zu führen, in dem listening-thread, wo das problem liegt, aber selbst wenn ich kommentieren srReciever.Schließen(), ich bekomme immer noch den Fehler.

Soweit ich das beurteilen kann, gibt es keine Nebenwirkungen verursacht, die nur durch den Fang den Fehler und bewegen auf, aber nicht wirklich sitzen bei mir richtig. Brauche ich, um diesen Fehler zu beheben, und wenn ja, hat jemand irgendwelche Ideen?

  • Nur ein weiteres Beispiel für eine Ausnahme ausgelöst wird, um anzuzeigen, dass ein nicht-außergewöhnlichen Zustand. Die meisten Menschen denken, schlechte API-design, aber mit .NET BCL es ist an der Tagesordnung.
InformationsquelleAutor Excrubulent | 2012-01-06
Schreibe einen Kommentar