簡體   English   中英

避免NetworkStream讀取塊

[英]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.

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