gpt4 book ai didi

c# - 加载按钮阵列的背景图像时内存不足

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:27 25 4
gpt4 key购买 nike

我正在尝试从数据库加载一组图像并为一组按钮设置背景图像。

加载按钮的背景图像时,我似乎“内存不足”。我用图片框(而不是按钮)尝试了这种方法,并且有效。

我做错了什么?

Button[] pb = { pictureButton1, pictureButton2, pictureButton3, pictureButton4, pictureButton5,
pictureButton6, pictureButton7, pictureButton8, pictureButton9, pictureButton10, pictureButton11, pictureButton12, pictureButton13,
pictureButton14, pictureButton15, pictureButton16, pictureButton17, pictureButton18, pictureButton19, pictureButton20, pictureButton21 };


using (MySqlDataReader dr = cmdDataBase.ExecuteReader())
{
int i = 0;
while (dr.Read())
{
using (MemoryStream stream = new MemoryStream())
{
if (dr["ITEM_Picture"] != DBNull.Value)
{
byte[] image = (byte[])dr["ITEM_Picture"];
stream.Write(image, 0, image.Length);
Bitmap bitmap = new Bitmap(stream);
if (i >= 21)
{
return;
}
pb[i].BackgroundImage = (bitmap);

}
}

i++;

}
}

最佳答案

你有一些内存泄漏:

线

pb[i].BackgroundImage = (bitmap);

正在制作 bitmap 的深拷贝,我不确定这是否是您想要的。在任何一种情况下,您当前的实现都是创建一个位图,复制它(这可能是资源密集型的并且应该避免 - 您正在分配一些东西然后复制它只是为了方便为新位图提供本地标签),并且永远不要释放在创建当前 bitmap 实例时分配的内存。

试试这个:

using(var bitmap = new Bitmap(stream))
{
if (i >= pb.Length)
{
return;
}
pb[i].BackgroundImage = (bitmap);
}

如果这不是问题:在哪一行抛出异常?

此外,您真的不应该构建像pb 这样的数组。尝试遍历父级的 Controls 属性并检查 PictureButtons。拥有像这样的硬编码数组意味着当任何人添加、删除或重命名控件时,您的加载代码必须更新。另外,我希望您的数据库查询正确排序按钮而不依赖于插入顺序。

此外,我还得问:如果 PictureButton 的数量与数据库中的行数不同,会发生什么情况?这是一个非常脆弱的设计。 (显然它不会崩溃,但图像将被忽略,或者按钮将留空,或者更糟的是,显示上次刷新时加载的任何图像 - 陈旧数据)。

关于c# - 加载按钮阵列的背景图像时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31012452/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com