NetworkStream读取速度极慢

时间:2015-04-27 23:53:32

标签: c# .net sockets networkstream

我正在使用C#NetworkStream来读取/写入IP地址(而不是DNS地址)。
我的程序正在取代大型机上的一个非常旧的汇编语言程序。现在它在Windows上。

我正在写/读取少于200个字节。字符串以LineFeed字符结尾,因此我在StreamReader.Readline()之后使用Stream.Write()来阅读回复。在IBM上,写入/读取周期为300ms

现在大约在每次读取或读取2次后,读取需要15秒。当我读取发件人的日志时,它会在不到一秒的时间内发送数据。出于某种原因,我得到了15秒的延迟。

我对发生的事情毫无头绪。

P.S。 我注意到一个奇怪的事情,如果我将流读取超时设置为4秒,它会超过4秒。如果我将超时设置为10秒或没有超时,则会在15秒后超时。

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();

1 个答案:

答案 0 :(得分:0)

您的连接保持打开状态,因为您的代码永远不会释放您的IDisposable资源。

  1. 我认为如果添加using结构,您的代码应该运行得更快。
  2. 你也可以合并声明和赋值,这样(这只是一个样式注释,主要关注的是`IDisposable用法)
  3. 你可以ReadToEnd回复你的信息,并在释放资源后自己检查。
  4. 所以你的代码看起来像这样:

    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);