我有一個方法可以通過TcpClient
的NetworkStream
讀取一些數據,並且它給了我一些錯誤。TcpClient的NetworkStream讀取不完整的數據,除非調用Thread.Sleep(1)
在調查過程中,我發現它實際上工作正常......但只有當我使用Visual Studio 2012的調試器使用斷點逐步完成代碼時。
這裏是我的代碼:
public static byte[] DownloadStream(string hostname, int port,
byte[] requestBytes, int bufferSize = 4096)
{
byte[] responseBytes = null;
var client = new System.Net.Sockets.TcpClient(hostname, port);
if (client.Connected)
{
using (var stream = client.GetStream())
{
stream.Write(requestBytes, 0, requestBytes.Length);
stream.Flush();
if (stream.CanRead)
{
var responseStream = new System.IO.MemoryStream();
byte[] buffer = new byte[bufferSize];
int bytesRead = 0;
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
responseStream.Write(buffer, 0, bytesRead);
}
while (stream.DataAvailable);
responseBytes = responseStream.ToArray();
}
}
}
client.Close();
return responseBytes;
}
這是非常令人沮喪,因爲沒有真正的錯誤。它顯然只需要調試器在讀取NetworkStream
時握住它的手。
有人知道爲什麼會發生這種情況嗎?我該如何解決它?
編輯:
由於某種原因使這種變化消除了問題:
do
{
bytesRead = stream.Read(buffer, 0, buffer.Length);
responseStream.Write(buffer, 0, bytesRead);
System.Threading.Thread.Sleep(1); //added this line
}
while (stream.DataAvailable);
對此有何見解?
請說明預期結果和實際結果。 –
它只是不讀取所有的字節。結果是不完整的,最終導致我的應用程序的另一部分出現XML解析錯誤。 – Kehlan
不要在循環中調用'stream.Read',而是嘗試調用'stream.CopyTo(responseStream)'(.NET 4及更高版本)並查看是否解決了問題。 –