このアプリケーションでは、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 の内部実装は、読み取ったデータをキャッシュしていると思います。
ありがとうございました!