Ich habe DotMemory zum Profil @Rana_Ian Lösung, und ich rief GC, um die vollständige Sammlung zu erzwingen. Ich fand, dass große Ströme wird eingeklebt LOH ! Und nach Hinzufügen einer zusätzlichen Zeile
public static void Clear(MemoryStream ms)
{
var buffer = ms.GetBuffer();
Array.Clear(buffer, 0, buffer.Length);
ms.Position = 0;
ms.SetLength(0);
ms.Capacity = 0; // <<< this one ******
}
Ich klickte auf F12 zu sehen Capacity
Implementierung, Und ich habe das gefunden (ich habe den generierten Code ein wenig vereinfacht - ich verwende Resharper):
public virtual int Capacity
{
get
{ .... // some code }
set
{
if ((long) value < this.Length) { // throw some ex }
if (!this._isOpen) { // some another code }
if (!this._expandable && value != this.Capacity) { //MemoryStreamNotExpandable }
if (!this._expandable || value == this._capacity) return;
if (value > 0)
{
byte[] numArray = new byte[value];
if (this._length > 0)
Buffer.InternalBlockCopy((Array) this._buffer, 0, (Array) numArray, 0, this._length);
this._buffer = numArray;
}
else
this._buffer = (byte[]) null; /// <<<< that's it! I need this one
this._capacity = value;
}
}
Es löscht also den Puffer, ich bin mir nicht sicher, ob das richtig ist oder nicht!