2016-07-15 61 views

回答

1

這取決於正在使用的流的實現細節。從上Stream base class

在MSDN文檔流是字節,諸如文件,輸入/輸出設備,進程間通信管道,或TCP/IP套接字的序列的抽象。 Stream類及其派生類提供了這些不同類型的輸入和輸出的通用視圖,並將程序員與操作系統和底層設備的具體細節隔離。

如果該流的implementator沒有留下關於如何處理與多個後續Write調用任何額外的指導,我們應該假定它處理那些細節沖洗你。

我假設你覺得這個答案有點令人失望,所以挖得更深一點。正如你所說你的同事正在使用Response.OutputStream讓我們看看該屬性的底層實現是什麼。

get 
{ 
    if (!this.UsingHttpWriter) 
    { 
     throw new HttpException(SR.GetString("OutputStream_NotAvail")); 
    } 
    return this._httpWriter.OutputStream; 
} 

因此,它是利用東西Stream_httpWriter。該字段證明存在對HttpWriter的實例的引用。它OutputStream財產得到初始化在構造函數中:

this._stream = new HttpResponseStream(this); 

HttpResponseStream是內部的,但我們可以用ILSpy來撬開它。它Write方法推遲實施回到這個HttpWriter的方法:

internal void WriteFromStream(byte[] data, int offset, int size) 
{ 
    if (this._charBufferLength != this._charBufferFree) 
    { 
     this.FlushCharBuffer(true); 
    } 
    this.BufferData(data, offset, size, true); 
    if (!this._responseBufferingOn) 
    { 
     this._response.Flush(); 
    } 
} 

正如你所看到的字節[]數據被傳遞給還進一步複製和存儲與幫助HttpResponseUnmanagedBufferElement其複製字節的數據的方法以Marshal.Copy存儲到非託管內存的緩衝區。該內存似乎分配在一個集成管道中大約16K的區塊,其餘的大約31K。因此,我不希望Stream分配太多的內存,以至於內部結構在LOH上結束,因爲從外觀上看,它只會產生託管 - >非託管內存副本。

留下您的想法,我們定期在循環中調用Flush。該HttpResponseStream有這樣實現:

public override void Flush() 
{ 
    this._writer.Flush(); 
} 

其中_writer是較早發現HttpWriter。它的實現是

public override void Flush() 
{ 
} 

這是正確的,調用flush只會浪費CPU週期。儘管有前途的documentation in MSDN,但它不會幫助該流盡快清除緩衝區。

+0

看來你是正確的:http://referencesource.microsoft.com/#System.Web/HttpWriter.cs,0373c8927b6c5833 - Flush沒有做什麼有趣。謝謝! – user420667

相關問題