简体   繁体   中英

NetworkStream Read Extremely Slow

I'm using a C# NetworkStream to read/write to an IP address (not a DNS address).
My program is replacing a very old assembly language program that was on a mainframe. Now it's on Windows.

I'm writing/reading less than 200 bytes. The strings end with a LineFeed character so I'm using a StreamReader.Readline() to read a response, after my Stream.Write() . On the IBM a write/read cycle took 300ms .

Now about after every 2nd or 3 read, it takes 15 seconds for the read. When I read the log of the sender it is sending the data in less than a second. For some reason I get these 15 second delays.

I'm clueless on what's happening.

ps One weird thing I noticed if I set the stream read timeout to 4 seconds, it times out around 4 seconds. If I set the timeout to 10 seconds or no timeout, it times out after 15 seconds.

TcpClient tcpc = null;
NetworkStream stream = null;
StreamReader sr = null;

tcpc = new TcpClient();
tcpc.NoDelay = true;
tcpc.ExclusiveAddressUse = false;
tcpc.Connect("172.18.10.100", 4004);

stream = tcpc.GetStream();
sr = new StreamReader(stream, Encoding.ASCII);
sr.Peek();

string Message = null;
Message = "IX3543543" + '\r';
stream.Write(Encoding.ASCII.GetBytes(Message), 0, Message.Length);
string readmsg = null;
for (int i = 0; i < 4; i++)
    readmsg = sr.ReadLine();

Your connection stays open as your code never free your IDisposable resources.

  1. I think that your code should run faster if you add the using constructure.
  2. Also you can merge declaration and assignment, like this (this is only a style comment, the main concern is `IDisposable usage)
  3. And you can ReadToEnd your message in return, and examine it by youself after releasing the resources.

So your code could look something like this:

string response = null;
using(var tcpc = new TcpClient())
{
    tcpc.NoDelay = true;
    tcpc.ExclusiveAddressUse = false;
    tcpc.Connect("172.18.10.100", 4004);

    using (var stream = tcpc.GetStream())
    using (var sr = new StreamReader(stream, Encoding.ASCII))
    {
        sr.Peek();

        var Message = "IX3543543" + '\r';
        stream.Write(Encoding.ASCII.GetBytes(Message), 0, Message.Length);
        response = sr.ReadToEnd();
    }
}

// examine message here
var lines = response.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM