在我们的应用程序中,我们正在使用 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 的内部实现是缓存读取的数据。
谢谢!