![](/img/trans.png)
[英]NetworkStream.ReadTimeout failing to block on NetworkStream.Read(…) when daylight savings are applied and clock moves backwards
[英]Avoid NetworkStream read block
目前,我一直在研究使用TcpClient從服務器接收數據的程序。 我的問題是,只要我閱讀流,直到我的客戶端停止工作,它就會凍結。 我想保持與服務器的連續連接,但是當我的while函數運行兩次后,第三個循環不執行讀取操作,並且從不返回任何內容。
我該如何中斷或返回while循環,或者以某種方式繞過閱讀塊?
using (NetworkStream stream = client.GetStream())
{
byte[] data = new byte[2048];
using (MemoryStream ms = new MemoryStream())
{
int numBytesRead;
while ((numBytesRead = stream.Read(data, 0, data.Length)) > 0)
{
ms.Write(data, 0, numBytesRead);
}
return ms.ToArray();
}
}
我會盡力給你一些提示。 如果您不希望凍結UI,則應該將該代碼放在單獨的線程上 ,或者將其作為異步任務運行,如Wouter所言。 在我看來,如果您既不知道希望接收多少字節,也不知道何時收到它們,這將是更好的方法。 如您所說,如果您想長時間運行此任務,那么線程將是一個很好的解決方案。
盡管如此,如果可能的話,您應該擔心兩件事:TcpClient的ReadTimeout
屬性和要通過stream.Read()
的第三個參數傳遞的預期長度。 這意味着您將被屏蔽X毫秒,直到收到所需的數量為止。 我在事務處理服務器上做了很多工作,其中在那些網絡之間傳輸的數據包以包的長度為前綴。 如果是這種情況,我建議先讀取前綴,然后計算剩余要讀取的字節數,然后執行最后一個讀取操作。
希望這會有所幫助,這是我的第一個答案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.