私はwinformアプリケーションを持っています。メインフォームはシングルトンで、たくさんの画像をロードします。画像は製品を表し、画像をクリックするたびに、製品の在庫を変更し、製品と画像のハッシュテーブルをリロードします。
この問題は、BBDD から製品のハッシュテーブルをリロードして画像をリロードするたびに発生します。結局のところ、アプリケーションは大量のメモリを消費し、リロードするためにいつ、どのようにイメージをアンロードすればよいかわかりません (イメージを変更できて、リロードしなければならない場合があるため)。
ハッシュテーブルとボタンをリロードするコードは次のとおりです。
Family fam = new Family();
List<Family> listFamilies = fam.loadFamilies();
htProducts.Clear();
foreach(Family family in listFamilies)
{
//reload all the products of each family
if(htProducts[family.idFamily]==null)
{
List<Product> listProducts= fam.loadProductsFamily(family.idFamily);
htProducts[family.idFamily] = listProducts;
}
Button bt = new Button();
bt.location = new Point(x,y); //The buttons are created dinamically
bt.Parent = panelFamilies;//I have all the buttons inside a panel.
try
{
if(family.urlImage !="")
{
bt.Text=family.Name;
bt.Image = new Bitmap(family.urlImage);
}
}
catch(Exception ex)
{
....
}
}
ファミリ ボタンをクリックすると、そのファミリの製品が読み込まれますが、コードはほぼ同じです。また、画像もロードします。
多かれ少なかれこれがコードです。問題は、ボタンをクリックするたびに、製品と画像をロードするボタンをさらにロードすることです。
多くの場合、シングルトン フォームをリロードして前のコードを実行し、イメージを再度ロードしてメモリを消費します。
¿いつ、どのように画像をアンロードする必要がありますか?
編集:
画像付きのボタンを再度読み込む前に、次のコードを追加しました。
foreach (Control c in panel8.Controls)
{
if (c is Button)
c.Dispose();
}
GC.Collect(GC.MaxGeneration);// I think that isn't correct to use because I've read, but reduces the memory.
パネルのすべてのボタンと画像を破棄し、画像を再度ロードする前にメモリを減らしますか?
ところで私の英語でごめんなさい:(
どうもありがとう。