gpt4 book ai didi

c# GDI+,在循环中创建一个 LinearGradientBrush(内存泄漏)

转载 作者:太空宇宙 更新时间:2023-11-03 19:36:24 24 4
gpt4 key购买 nike

今天我遇到了一个难题。我创建了一个使用 GDI+ 在表单上绘制的应用程序。绘图每秒由计时器触发。 draw 方法使用 for 循环遍历对象集合,如果它们处于特定状态,则绘制它们。

我想使用 LinearGradientBrush 绘制它们,因为它看起来比简单的 Brush 好得多。看看下面的内容

            //minutes
foreach (Led l in MinuteGrid.Leds)
{
LinearGradientBrush b = new LinearGradientBrush
(l.LedRectangle, Color.GreenYellow, Color.Green, 110);

if (l.IsLit)
g.FillRectangle(b, l.LedRectangle);

b.Dispose();
}

我正在为循环的每次迭代创建一个新的 LinearGradientBrush(这让我很困扰),但那是因为我必须这样做。我无法在循环外创建一个,因为它的构造函数集要求我设置仅在循环内已知的参数。

我发现在 LinearGradientBrush 对象上使用 dispose 方法并不是那么可靠。如果我运行我的应用程序并在任务管理器中查看它,它会喷涌而出。然后,当我添加 b = null 行时,它似乎有很大帮助,如下所示

            foreach (Led l in MinuteGrid.Leds)
{
LinearGradientBrush b = new LinearGradientBrush
(l.LedRectangle, Color.GreenYellow, Color.Green, 110);

if (l.IsLit)
g.FillRectangle(b, l.LedRectangle);

if (b != null)
{
b.Dispose();
b = null;
}
}

我只是想知道是否有更好的方法来处理 LinearGradientBrushes ?或者有更好的解决方案可以使用吗?

非常感谢

最佳答案

我建议使用“using”语句:

foreach (Led l in MinuteGrid.Leds)
{
if (l.IsLit)
{
using(LinearGradientBrush b = new LinearGradientBrush(l.LedRectangle, Color.GreenYellow, Color.Green, 110))
{
g.FillRectangle(b, l.LedRectangle);
}
}
}

但是,请记住,Dispose() 不会释放(托管)内存。它只是释放非托管资源(这很重要,可能包括非托管内存)。在 GC 运行之前,内存不会释放,这在循环期间可能不会发生。

但是,如果内存压力过高,垃圾收集器应该在您的循环中运行,您会看到它下降。这就是 .NET 的设计方式 - 接受它,不要担心。 GC 最终会回收此内存,因此无需担心。

关于c# GDI+,在循环中创建一个 LinearGradientBrush(内存泄漏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1336721/

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