2015-04-27 169 views
1

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

我正在写/读小于200字节。字符串以LineFeed字符结尾,所以我使用StreamReader.Readline()来读取响应,在我的Stream.Write()之后。在IBM上,一个写/读周期花费了300ms

现在约每读完2或3次读取,读取时间为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(); 
+0

你尝试用较小的尺寸来读取数据吗?说16个字节?可能是你的主机保持连接,并因此导致延迟。 – VMAtm

+0

我在写一个终端服务器,它后面有一个服务器。我的程序正在取代大型机程序。我建立连接并且永不关闭它或流。 Netstat -n -t 2显示连接保持打开状态。连接永远不会进入wait_state。我也在想它某种奇怪的Windows事物或反病毒程序或其他东西。但是,我在一台服务器和一台笔记本电脑上运行我的程序,结果相同。所以我很茫然。 – user965445

+0

你能提供你的代码吗? – VMAtm

回答

0

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

  1. 我认为如果您添加using结构,您的代码应该运行得更快。
  2. 您也可以合并申报,分配,这样的(这只是一种风格的评论,主要关注的是'IDisposable的使用)
  3. 你可以都由你自己释放资源后,在返回ReadToEnd您的信息,并检查它。

所以,你的代码可能是这个样子:

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

这是一个7x24程序,所以我不想关闭流或连接。 真正的代码是几千行,因为数据库写入和读取正在发生。所以使用语句是不实际的。我只是举了一个最简单的例子来说明问题 – user965445

+0

如果你不关闭连接你为什么惊讶它是开放的?实现绩效的最佳途径是尽快建立密切联系,并在必要时开放另一个。 – VMAtm

+0

我做了一个网络跟踪。 我发现在C#代码中我做了一个发送。 15秒后,它显示在发送的NetMonitor跟踪中。 我禁用了Symantec Endpoint Protection,没有任何更改。 – user965445