我负责处理 BackgroundImage 吗?

Posted

技术标签:

【中文标题】我负责处理 BackgroundImage 吗?【英文标题】:Am I responsible for Disposing a BackgroundImage? 【发布时间】:2010-12-08 04:00:28 【问题描述】:

我有一个 Windows 窗体,我将 BackgroundImage 属性设置为自定义位图图像。

私人图像 MakeCustomBackground() 位图结果 = 新位图 (100, 100); 使用(图形画布 = Graphics.FromImage(结果)) // 绘制自定义图像 返回结果; 私人无效UpdateFromBackground() this.BackgroundImage = MakeCustomBackground();

我的问题是,图像是一次性的,我正在创建它,这是否意味着我必须处理它?或者当我通过 BackgroundImage 将图像传递给表单时,它是否会取得所有权并在不再需要它时将其丢弃?

【问题讨论】:

【参考方案1】:

假设UpdateFromBackground() 被多次调用,您可能应该在设置新图像时(之前)处理图像。如果你不这样做,那么 GC 最终会这样做,但效率较低。该表单只会处理您分配的最后一个 BgImage。

private void UpdateFromBackground()

    if (this.BackgroundImage != null)
    
       this.BackgroundImage.Dispose();
    
    this.BackgroundImage = MakeCustomBackground();

【讨论】:

一旦你覆盖了 BackgroundImage 属性,假设没有其他对 Image 实例的引用,GC 最终会像 Henk 所说的那样处理它。我想强调的是,控件没有明确处理该实例,因此最好自己处理它。您可以使用两个不同的变量 imageA 和 imageB 对此进行测试,每个变量都设置为不同的 Image 实例。将 BackgroundImage 设置为 imageA,然后设置为 imageB,然后测试 imageA 是否已被释放 - 你会发现它没有被释放。

以上是关于我负责处理 BackgroundImage 吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 OpenOCD 来识别负责使用 stm32f4 处理器的设备上的用户触发功能的指令吗?

c# BackgroundImage的问题

UIButton 的 backgroundImage 的内容模式不受尊重

js改变backgroundImage??

如何阻止我的自定义 UITableViewCell backgroundImage 可拉伸?

Vue绑定样式动态backgroundImage带参数使用asset