Ich habe den Speicherstream verwendet, um die Datei herunterzuladen. Sobald die Datei heruntergeladen wurde, muss ich den gesamten von diesem Speicherstrom belegten Speicher löschen.Sauberer Speicher wird verwendet
// Eine Datei entschlüsseln und im Speicherstream speichern.
public MemoryStream DecryptAndStoreInMemory(string inputFilePath, string userFileName)
{
MemoryStream msOutput = null;
if (File.Exists(inputFilePath))
{
try
{
using (Aes encryptor = Aes.Create())
{
Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(_password, _salt);
encryptor.Key = pdb.GetBytes(32);
encryptor.IV = pdb.GetBytes(16);
using (FileStream fsInput = new FileStream(inputFilePath, FileMode.Open))
{
using (CryptoStream cs = new CryptoStream(fsInput, encryptor.CreateDecryptor(), CryptoStreamMode.Read))
{
using (msOutput = new MemoryStream())
{
int data;
while ((data = cs.ReadByte()) != -1)
{
msOutput.WriteByte((byte)data);
}
}
}
}
}
return msOutput;
}
catch (CryptographicException)
{
throw new Exception("Sorry we can not serve " + userFileName + " file at this time.");
}
catch (Exception)
{
throw;
}
}
else
{
throw new Exception("Sorry we could not locate " + userFileName);
}
}
Nachdem die Datei zur Antwort gesendet wurde, wird der Speicher nicht freigegeben. Es dauerte fast doppelt so groß wie die Datei. 17 MB Datei benötigt fast 40 MB Speicher.
Was sollte getan werden, um diesen Raum freizugeben. Ich habe versucht, Byte-Array zu löschen, aber festgestellt, dass es nur jedes Element des Arrays mit 0 ersetzt behält seine Länge gleich.
Die erste Verteidigungslinie ist der Garbage Collector. Wenn die Variable "bytesInStream" nirgends mehr referenziert wird, sollte sie gesammelt und der Speicher freigegeben werden. Das setzt auch voraus, dass "BytesInStream" der eigentliche Unruhestifter ist. Können Sie versuchen, 'GC.Collect();' und 'GC.WaitForPendingFinalizers();'? Wird der Speicherverbrauch bei der Speicherprofilerstellung besser, wenn Sie ein wenig warten? –
@MaximilianGerhardt Ich habe GC.Collect() oben und unten geschrieben, was zur Folge hat, dass der Speicher bei der nächsten Anfrage für die gleiche Datei bereinigt wird. Wenn ich die gleiche Datei erneut anfordere, dann wird der Speicher frei, der zuvor verwendet wurde, und wieder reservieren Sie den Speicher –