2

以下のコードのように、実行時にウィンドウにコントロールを追加する WPF アプリケーションがあります。

tempImg = new System.Windows.Controls.Image();
tempImg.Width = 65;
tempImg.Source = new BitmapImage(new Uri("pack://application:,,,/Imagesic_web_64h.png"));
tempImg.Tag = text;
tempImg.ToolTip = text;
presenter.webLinks.Add(text);
ExtraContent.Items.Add(tempImg);

上記のコードで、 ExtraContent はlistbox. 私の質問は、上記をループして複数の画像コントロールを追加するlistboxと、メモリリークが発生するということですか?

多くの場所に同様のコードがあり、このウィンドウを開いてコントロールを追加すると、予想どおりメモリ使用量が高くなることがわかりますが、このウィンドウを閉じた後でもメモリは低下しません。

誰でもこれへのポインタを提供できますか?

4

2 に答える 2

2

観測された動作は、WPF が BitmapImages をメモリにキャッシュするという事実に起因する可能性があります。画像の読み込み中にBitmapcacheOption.Noneフラグを設定することで、キャッシュを無効にできると思います。

var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.CacheOption = BitmapCacheOption.None;
bitmapImage.UriSource = new Uri("pack://application:,,,/Imagesic_web_64h.png");
bitmapImage.EndInit();
tempImg.Source = bitmapImage;

また、キャッシュが無効になっている場合、特に画像が複数回使用されている場合は、パフォーマンスが低下する可能性があることを付け加えておきます。

于 2013-01-07T13:35:54.827 に答える
1

ウィンドウを閉じると、リソースが解放されるという保証はありません。

.NET では、メモリが不足している場合にのみリソースを解放するのが通例です。これにより、時間を節約できます。

@Clemens で言及されているようにキャッシュを無効にすることもできますが、明らかに、キャッシュがないためにパフォーマンスが低下する可能性があります。

すぐにメモリリークを主張しないでください。あなたは間違っているかもしれません。それをテストします。

于 2013-01-07T13:43:54.150 に答える