私の状況では、ビットマップキャッシングが問題だったようです。
Bitmap bitmap = new Bitmap();
using(var stream = new FileStream(...))
{
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.OnLoad;
bitmap.StreamSource = stream;
bitmap.EndInit();
}
bitmap.Freeze();
image.Source = bitmap;
継続的にだけ手動でガベージコレクションは本当に助けていなかったを強制的に、メモリを築いimage.Source
同じように置き換える:私は以前にこのようなビットマップをロードしました。
代わりに、キャッシングを無効にしてストリームを使用すると(画像が表示されるまでストリームを開いたままにする必要があります)、手作業によるガベージコレクションと組み合わされるとメモリが増えなくなります。
Stream mediaStream;
void DisposeMediaStream()
{
if (mediaStream != null)
{
mediaStream.Close();
mediaStream.Dispose();
mediaStream = null;
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced, true);
}
}
void Update()
{
DisposeMediaStream();
var bitmap = new BitmapImage();
mediaStream = new FileStream(...);
bitmap.BeginInit();
bitmap.CacheOption = BitmapCacheOption.None;
bitmap.StreamSource = mediaStream;
bitmap.EndInit();
bitmap.Freeze();
ControlImage.Source = bitmap;
}
この方法では、(Windowsフォトビューアーのような)たくさんの画像を循環させることができ、メモリは低いままです。画像が実際にレンダリングされると、ストリームは開いたままである必要はありません。
はい、それは昔の私のために働いた。 – AgentFire
偉大な答え、ありがとう。私を助けてくれました。 – MDDDC