在我们的应用程序中,我们使用System.IO.Packaging.Package类读取XPS文件。当我们从PackagePart的流中读取时,可以看到任务管理器中应用程序的内存消耗量增加。但是,当读取完成后,内存消耗并不会回到读取之前的原始状态。
为了说明问题,我编写了一个简单的代码示例,您可以将其用于独立的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();
}
}
ReadPackage()方法将读取所有PackagePart对象的流内容到本地数组中。在示例中,我使用了一个1000页的XPS文档作为包源,以便轻松查看应用程序的内存消耗变化。在我的机器上,独立应用程序的内存消耗从18MB开始,调用该方法后上升到100MB。再次调用该方法可能会再次提高内存消耗,但它可能会回到100MB。然而,它不再回到18MB。
有人在使用PackagePart时遇到过这种情况吗?还是我使用不正确?我认为PackagePart的内部实现正在缓存已读取的数据。
谢谢!