これは、使用されているストリームの実装の詳細によって異なります。 Stream base class
上のMSDNドキュメントからのストリームは、ファイル、入力/出力装置、プロセス間通信パイプ、またはTCP/IPソケットなどのバイトのシーケンスの抽象化です。 Streamクラスとその派生クラスは、これらの異なる入出力タイプの一般的なビューを提供し、オペレーティングシステムとその基礎となるデバイスの特定の詳細からプログラマーを分離します。
そのストリームの作成者は、我々はそれがあなたのためにそれらのフラッシング詳細を処理しなければならないと仮定し、複数のその後のWrite
の呼び出しに対処する方法上の任意の追加のガイダンスを残さなかった場合。
私はこの答えが少し残念だと思うので少し深く掘り下げてください。あなたの同僚がResponse.OutputStream
を使用していると言えば、そのプロパティの基礎となる実装が何であるかを見てみましょう。
get
{
if (!this.UsingHttpWriter)
{
throw new HttpException(SR.GetString("OutputStream_NotAvail"));
}
return this._httpWriter.OutputStream;
}
だから、_httpWriter
で何かからStream
を使用しています。そのフィールドはHttpWriter
のインスタンスへの参照を保持することが分かります。それは、OutputStream
プロパティは、コンストラクタで初期化されますです:
this._stream = new HttpResponseStream(this);
クラスHttpResponseStream
は内部にあるが、我々はオープン、それをてこのようにILSpyを使用することができます。あなたがバイトを見ることができるように[]のデータは、さらに助けHttpResponseUnmanagedBufferElement
コピーバイトのデータをコピーして保存する方法に渡されている
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();
}
}
:そのWrite
方法は戻って、このHttpWriterのメソッドに実装を延期しますアンマネージメモリであるバッファにMarshal.Copy
のバッファを追加します。そのメモリは、統合されたパイプラインの場合は約16Kブロック、残りのパイプラインの場合は約31Kブロックで割り当てられているようです。
これで、Streamは内部構造がLOH上に終わるほど多くのメモリを割り当てるとは思っていませんが、それは見た目では管理されていないメモリコピーしか作成しないからです。
定期的に電話でFlush
を呼び出すことをお勧めします。 HttpResponseStream
は、この実装を持っている:
_writer
以前は
HttpWriter
を発見され
public override void Flush()
{
this._writer.Flush();
}
。その実装は、フラッシュが唯一のCPUサイクルを無駄に呼び出して、右である
public override void Flush()
{
}
です。これは、有望なdocumentation in MSDNにもかかわらず、早急にバッファをクリアする際にストリームを助けません。
正しいと思われます。http://referencesource.microsoft.com/#System.Web/HttpWriter.cs,0373c8927b6c5833 - Flushが何もしないのは面白いことです。ありがとう! – user420667