今天我遇到了一点困境.我创建了一个使用GDI +在表单上绘制的应用程序.绘图由计时器每秒触发.draw方法使用for循环遍历对象集合,如果它们处于某种状态,则绘制它们.
我想使用LinearGradientBrush绘制它们只是因为它看起来比简单的刷子好得多.看看下面的内容
//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();
}
Run Code Online (Sandbox Code Playgroud)
我正在为循环的每次迭代创建一个新的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;
}
}
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更好的方法来使用LinearGradientBrushes?或者是否有更好的解决方案?
非常感谢
我建议使用"使用"声明:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,请记住,Dispose()不会释放(托管)内存.它只是释放非托管资源(这很重要,可能包括非托管内存).GC运行之前内存不会释放,这可能不会在循环期间发生.
但是,如果内存压力过高,垃圾收集器应该在你的循环中运行,你会看到它下降.这就是.NET的设计方式 - 只需接受它,不用担心.GC最终会收集这些内存,所以不用担心.
| 归档时间: |
|
| 查看次数: |
1738 次 |
| 最近记录: |