Nella nostra applicazione, stiamo leggendo un file XPS utilizzando la classe System.IO.Packaging.Package. Quando leggiamo da uno stream di un PackagePart, possiamo vedere dal Task Manager che il consumo di memoria dell'applicazione aumenta. Tuttavia, al termine della lettura, il consumo di memoria non torna a quello che era prima della lettura dal flusso.La lettura dal flusso di PackagePart non rilascia memoria
Per illustrare il problema, ho scritto un semplice esempio di codice che è possibile utilizzare in un'applicazione wpf autonoma.
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
_package = Package.Open(@"c:\test\1000pages.xps", FileMode.Open, FileAccess.ReadWrite, FileShare.None);
}
private void ReadPackage()
{
foreach (PackagePart part in _package.GetParts())
{
using (Stream partStream = part.GetStream())
{
byte[] arr = new byte[partStream.Length];
partStream.Read(arr, 0, (int)partStream.Length);
partStream.Close();
}
}
}
Package _package;
private void Button_Click(object sender, RoutedEventArgs e)
{
ReadPackage();
}
}
Il metodo ReadPackage() legge tutto il contenuto del flusso degli oggetti PackagePart in un array locale. Nell'esempio, ho usato un documento XPS di 1000 pagine come sorgente del pacchetto per poter vedere facilmente la modifica del consumo di memoria dell'applicazione. Sulla mia macchina, il consumo di memoria della app autonoma inizia a 18 MB, quindi sale a 100 MB dopo aver chiamato il metodo. Chiamando di nuovo il metodo è possibile aumentare nuovamente il consumo di memoria, ma può ridursi a 100 MB. Tuttavia, non ricade più a 18 MB.
Qualcuno ha riscontrato questo problema durante l'utilizzo di PackagePart? O lo sto usando male? Penso che l'implementazione interna di PackagePart stia memorizzando nella cache i dati letti.
Grazie!
Non ho idea del motivo per cui questa domanda è stata downvoted. –