2014-02-18 46 views
2

考慮這個簡單的代碼:Stream.Read何時返回?

public void TransferStream(Stream source, Stream target) 
    { 
     Int32 read = -1; 
     Byte[] buffer = new Byte[4096]; 
     do 
     { 
      read = source.Read(buffer, 0, buffer.Length); 
      target.Write(buffer, 0, read); 
     } 
     while (read != 0); 
    } 

試想一下,sourceNetworkStream,信息是通過一點一點到達。 source.Read可以返回一個完整的緩衝區,或者與一個部分,read會告訴讀了多少。

如果沒有足夠的數據填充緩衝區,source.Read何時會返回?何時足夠用部分緩衝區返回?

回答

2

The documentation for `Stream.Read()'狀態:

該方法的

實現從 電流流讀取最多爲計數字節,並將它們存儲在緩衝開始偏移量。流內的當前位置 被提前讀取字節數 ;但是,如果發生異常, 流中的當前位置保持不變。

執行返回字節數 讀取。 該實現將阻塞,直到至少一個字節的數據 可以被讀取,如果沒有數據可用的話。只有在流中沒有更多數據且預計不會再有更多數據時纔會返回0 (如封閉套接字或文件結尾)。一個實現對 是免費的,即使流的末尾沒有達到 ,也會返回比請求更少的字節。

所以根據在於,所述的NetworkStream 塊,直到它被關閉或直到至少一個字節是可用的。不管它是否實際上是一個不同的問題 - 但我希望它確實如此。

它可以肯定返回一個部分緩衝區。但是更普遍的是,我過去發現,如果您有一個以共享模式打開的文件,並且在您讀取文件時正在寫入其他文件,那麼File.Read()可以返回零,即使數據仍然存在被寫入它(並且隨後的讀取返回非零) - 所以請注意這種事情。我認爲NetworkStream不會遭受這個問題,但。儘管如此,編寫一個測試程序來確定它肯定是一個好主意!

[編輯]

我看了看它的源代碼,並最終它最終調用Windows API函數recv()。我知道可以返回部分緩衝區,所以我們必須假設NetworkStream.Read()也可以返回部分緩衝區。

+0

對,我讀到了,但我認爲如果它是一個慢速連接,它將不太可能通過'Byte'返回'Byte'。但也許這就是它的真正作用。 – vtortola

+0

@vtortola我想你必須看看源代碼或測試它,當然。 –

+0

我只看了一下http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx,但找不到任何關於它的信息。 – vtortola