.NET NetworkStream Lese Langsamkeit

Ich habe einen Netzwerkcode zum Verarbeiten einer beliebigen TCP-Verbindung.

Es scheint alles wie erwartet zu funktionieren, scheint aber langsam zu sein. Wenn ich den Code profiliert habe, scheint er gute 600 ms in NetworkStream.Read () zu verbringen, und ich frage mich, wie ich ihn verbessern kann. Ich habe mit den Puffergrößen herumgespielt und zwischen einem massiven Puffer zum Lesen aller Daten auf einmal oder einem kleinen Puffer gewechselt, der die Daten zu einem StringBuilder verketten sollte. Derzeit ist der Client, den ich verwende, ein Webbrowser, aber dieser Code ist generisch und möglicherweise werden keine HTTP-Daten an ihn gesendet. Irgendwelche Ideen?

Mein Code ist dieser:

    public void StartListening()
    {
        try
        {
            lock (oSyncRoot)
            {
                oTCPListener = new TcpListener(oIPaddress, nPort);

                // fire up the server
                oTCPListener.Start();

                // set listening bit
                bIsListening = true;
            }

            // Enter the listening loop.
            do
            {
                // Wait for connection
                TcpClient newClient = oTCPListener.AcceptTcpClient();

                // queue a request to take care of the client
                oThreadPool.QueueUserWorkItem(new WaitCallback(ProcessConnection), newClient);
            }
            while (bIsListening);
        }
        catch (SocketException se)
        {
            Logger.Write(new TCPLogEntry("SocketException: " + se.ToString()));
        }
        finally
        {
            // shut it down
            StopListening();
        }
    }

    private void ProcessConnection(object oClient)
    {

        TcpClient oTCPClient = (TcpClient)oClient;
        try
        {
            byte[] abBuffer = new byte[1024];
            StringBuilder sbReceivedData = new StringBuilder();

            using (NetworkStream oNetworkStream = oTCPClient.GetStream())
            {
                // set initial read timeout to nInitialTimeoutMS to allow for connection
                oNetworkStream.ReadTimeout = nInitialTimeoutMS;

                int nBytesRead = 0;

                do
                {
                    try
                    {
                        bool bDataAvailable = oNetworkStream.DataAvailable;

                        while (!bDataAvailable)
                        {
                           Thread.Sleep(5);
                           bDataAvailable = oNetworkStream.DataAvailable;
                        }

                        nBytesRead = oNetworkStream.Read(abBuffer, 0, abBuffer.Length);

                        if (nBytesRead > 0)
                        {
                            // Translate data bytes to an ASCII string and append
                            sbReceivedData.Append(Encoding.UTF8.GetString(abBuffer, 0, nBytesRead));
                            // decrease read timeout to nReadTimeoutMS second now that data is coming in
                            oNetworkStream.ReadTimeout = nReadTimeoutMS;

                        }
                    }
                    catch (IOException)
                    {
                        // read timed out, all data has been retrieved
                        nBytesRead = 0;
                    }
                }
                while (nBytesRead > 0);

                //send the data to the callback and get the response back
                byte[] abResponse = oClientHandlerDelegate(sbReceivedData.ToString(), oTCPClient);
                if (abResponse != null)
                {
                    oNetworkStream.Write(abResponse, 0, abResponse.Length);
                    oNetworkStream.Flush();
                }
            }
        }
        catch (Exception e)
        {
            Logger.Write(new TCPLogEntry("Caught Exception " + e.StackTrace));
        }
        finally
        {
            // stop talking to client
            if (oTCPClient != null)
            {
                oTCPClient.Close();
            }
        }
    }

Bearbeiten: Ich erhalte ungefähr die gleichen Zahlen auf zwei völlig getrennten Maschinen (meine XP-Entwicklungsmaschine und eine 2003-Box in Farbe). Ich habe einige Zeitangaben in den Code für die relevanten Teile eingefügt (mithilfe von System.Diagnostic.StopWatch) und in ein Protokoll geschrieben:

7/6/2009 3:44:50 PM : Debug : While DataAvailable took 0 ms
7/6/2009 3:44:50 PM : Debug : Read took 531 ms
7/6/2009 3:44:50 PM : Debug : ProcessConnection took 577 ms

Antworten auf die Frage(3)

Ihre Antwort auf die Frage