2009-02-15 51 views
1

我收到以下異常:在C#中有沒有替代System.IO.BufferedStream?

System.NotSupportedException : This stream does not support seek operations. 
    at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin) 
    at System.IO.BufferedStream.FlushRead() 
    at System.IO.BufferedStream.WriteByte(Byte value) 

以下網站顯示,這是微軟的一個已知的問題。 http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=273186

此堆棧跟蹤顯示兩件事情:

  1. 的System.IO.BufferedStream做一些荒謬的指針移動操作。 BufferedStream應該緩衝基礎流而不是更多。如果有這樣的查找操作,緩衝區的質量將會很差。
  2. 對於不支持Seek的流,它將永遠不會運行穩定。

有沒有其他的選擇? 我需要一個緩衝區與C#中的NetworkStream一起,還是已經被緩衝了。

編輯:我想簡單地減少對底層套接字流的讀/寫調用次數。

+0

作爲寫入操作的結果,您是做了尋找還是做了它? – 2009-02-15 19:55:56

+0

如何在堆棧跟蹤中看到我只調用WriteByte()。問題是寫操作時在讀緩衝區中有數據。 – Horcrux7 2009-02-15 20:01:55

回答

1

A BufferedStream僅用於減少對底層數據流(可能是IO /硬件綁定)的讀/寫調用次數。它不能提供尋求能力(事實上,緩衝和尋求在許多方面與彼此相反)。

爲什麼你需要尋找?也許將流複製到某種可以首先尋找的東西 - 一個MemoryStream或一個FileStream - 然後從那秒開始您的實際工作,可尋找的流。

您是否有特定的目的?我可能會建議更多的細節更合適的選項...

特別是:請注意,NetworkStream是一個好奇心 - 大多數流,讀/寫涉及相同的物理流;然而,NetworkStream實際上代表兩個完全獨立的管道;讀寫是完全無關的。同樣,你不能以已經壓縮過的字節尋找......你可以用跳過數據,但是通過執行幾個Read opdrations並丟棄數據可以更好地完成。

2

NetworkStream已被緩衝。所有收到的數據都保存在一個緩衝區中,等待你閱讀。讀取的呼叫要麼非常快,要麼會阻止等待從網絡上的另一個對端接收數據,在任何情況下,BufferedStream都無濟於事。

如果你關心阻塞,那麼你可以看看底層套接字切換到非阻塞模式。