W naszej aplikacji odczytujemy plik XPS przy użyciu klasy System.IO.Packaging.Package. Kiedy czytamy ze strumienia PackagePart, widzimy w Menedżerze zadań, że wzrasta zużycie pamięci aplikacji. Jednak po zakończeniu odczytu zużycie pamięci nie powróci do wartości sprzed odczytu ze strumienia.Odczytywanie ze strumienia PackagePart nie zwalnia pamięci
Aby zilustrować problem, napisałem prosty przykład kodu, którego można użyć w samodzielnej aplikacji wpf.
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();
}
}
Metoda ReadPackage() odczyta zawartość strumienia obiektów PackagePart do lokalnej tablicy. W próbce użyłem dokumentu XPS o wielkości 1000 stron jako źródła pakietu, aby łatwo zobaczyć zmianę zużycia pamięci aplikacji. Na moim komputerze zużycie pamięci samodzielnej aplikacji zaczyna się od 18 MB, a następnie wzrasta do 100 MB po wywołaniu metody. Ponowne wywołanie metody może ponownie zwiększyć zużycie pamięci, ale może wrócić do 100 MB. Jednak już nie wraca do 18 MB.
Czy ktoś doświadczył tego podczas korzystania z PackagePart? Czy używam go źle? Myślę, że wewnętrzna implementacja PackagePart buforuje odczytane dane.
Dziękujemy!
Nie mam pojęcia, dlaczego to pytanie zostało odrzucone. –