2010-06-22 124 views
8

這個讓我感到困惑。當我甚至沒有打電話時,我遇到了關於尋找的錯誤?爲什麼BufferedStream.Write會拋出「此流不支持查找操作」?

我有一些代碼看起來是這樣的:

// send 42 
uint value = 42; 
byte[] msg = BitConverter.GetBytes(value); 
stream.Write(msg, 0, sizeof(uint)); 

,我得到這個異常:

System.NotSupportedException was unhandled 
Message="This stream does not support seek operations." 
Source="System" 
StackTrace: 
    at System.Net.Sockets.NetworkStream.Seek(Int64 offset, SeekOrigin origin) 
    at System.IO.BufferedStream.FlushRead() 
    at System.IO.BufferedStream.Write(Byte[] array, Int32 offset, Int32 count) 
... 

System.IO.BufferedStream類型。可能會發生什麼?

編輯更多信息:

在這種情況下sizeof(uint)==msg.length
流被聲明爲stream = new BufferedStream(new NetworkStream(socket), 1024)

編輯:

這就是它!雖然人們可以在一個NetworkStream上進行讀寫操作,但在切換到BufferedStream時,必須有一個單獨的讀寫器。顯然,只需在同一個套接字上調用兩次構造函數NetworkStream即可。

如果可以的話,我會接受賈斯汀和漢斯的答案,因爲一個讓我明白了什麼是錯的,另一個讓我找到解決方案。感謝大家!

+0

如果有幫助,BufferedStream位於NetworkStream之上。 – redtuna 2010-06-22 17:53:24

+0

你怎麼聲明緩衝流和什麼大小?它與哪種流類型相關聯?並且不應該sizeof(uint)是msg.length? – 2010-06-22 17:59:39

回答

9

問題在於BufferedStream的內部工作(以及事實上,您可能在嘗試寫入之前使用BufferedStream進行讀取)。

當您嘗試寫一個BufferedStream,驗證您的參數之後,事情的順序進行檢查(所有的代碼通過反射框架拉):


我們是在寫的乞討緩衝?

if(this._writePos == 0) 

我們是否允許寫入底層流?

if(!this._s.CanWrite) // throw error 

讀緩衝區是否爲空?

if(this._readPos < this._readLen) 
{ 
    // FlushRead() will attempt to call Seek() 
    this.FlushRead(); 
} 

如果在讀緩衝區讀數據時,同花順在寫之前嘗試。 FlushRead()調用Seek(),這是什麼導致你的錯誤

+0

好吧,所以我不能在有未讀數據時調用寫入......這意味着我不能有一個線程讀取,而另一個寫入同一個BufferedStream。現在,考慮到當我連接到另一臺計算機時我有一個NetworkStream,我如何從中獲取兩個BufferedStreams? – redtuna 2010-06-22 18:21:23

+0

@redtuna - 如果這是您的目標,您將不得不創建兩個NetworkStream來匹配兩個BufferedStream。否則,你會遇到與共享NetworkStream有關的大量問題。 – 2010-06-22 18:30:30

+0

謝謝@Justin。 – redtuna 2010-06-22 20:14:01

4

你一定早就讀過BufferedStream。它從NetworkStream獲取它的字節。這些是單向的,你可以只讀或只寫信給他們,這取決於他們是如何創建的。如果您需要更多幫助,請發佈創建NetworkStream的代碼。

+0

你可能會想:另一個線程可能同時嘗試讀取,這就是問題所在。文檔確實說你可以從同一個BufferedStream讀取和寫入(在我的情況下,.CanRead和.CanWrite都是真實的),但可能不是同一時間。 – redtuna 2010-06-22 18:07:00

+0

你應該有兩個NetworkStreams和兩個BufferedStreams,如果我正確理解這個點。從一個閱讀並寫入另一個。 – 2010-06-22 18:11:09

+0

@red:是的,BufferedStream支持讀寫。但是它正在讀/寫的流可能不支持它。 NetworkStream不。 – 2010-06-22 18:21:26

相關問題