.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