簡體   English   中英

NetworkStream讀取速度極慢

[英]NetworkStream Read Extremely Slow

我正在使用C# NetworkStream讀取/寫入IP地址(而不是DNS地址)。
我的程序正在替換大型機上非常老的匯編語言程序。 現在在Windows上。

我正在寫/讀少於200個字節。 字符串以LineFeed字符結尾,因此我在Stream.Write()之后使用StreamReader.Readline()讀取響應。 在IBM上,寫/讀周期花費300ms

現在大約每2或3次讀取后,讀取就需要15秒。 當我閱讀發送者的日志時,它在不到一秒鍾的時間內發送了數據。 由於某種原因,我得到了這15秒的延遲。

我對正在發生的事情一無所知。

ps我注意到,如果我將流讀取超時設置為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();

由於代碼永遠不會釋放IDisposable資源,因此您的連接保持打開狀態。

  1. 我認為,如果添加using結構,您的代碼應該運行得更快。
  2. 您也可以像這樣合並聲明和賦值(這只是一個樣式注釋,主要關注的是`IDisposable用法)
  3. 您可以返回ReadToEnd消息,並在釋放資源后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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM