【问题标题】:Out of Memory at 26 MB in C# [duplicate]C# 中 26 MB 内存不足 [重复]
【发布时间】:2017-04-02 01:04:46
【问题描述】:

我有一个绘图函数,它绘制从一端到另一端的渐变线。我每次只画大约四十条线。每次,我都会生成一组新的线性渐变画笔。旧集是一个与任何对象没有联系的局部变量。我的程序只使用了大约 26 MB 的内存。在分配新的线性渐变画笔时,它会在随机抛出内存不足异常之前正常工作几分钟。如您所见,发生异常时内存为 25.7 MB。

最小示例代码(会抛出内存异常):

注意:以下代码仅在用于图形上下文的重绘时触发异常,该上下文被调整大小,即使如此,仅在几分钟后。

class DrawImpl
{
    private static Pen routePen = new Pen(Color.Black);
    public static void Draw(Graphics g, Point[] ps)
    {
        g.SmoothingMode = SmoothingMode.HighQuality;            
        if (ps != null && ps.Length > 0)
        {
            for (int i = 0; i < ps.Length; ++i)
            {
                int prevI = (((i - 1) % ps.Length) + ps.Length) % ps.Length;
                using (LinearGradientBrush routeBrush = new LinearGradientBrush(ps[prevI], ps[i], Color.Red, Color.Blue))
                {
                    routePen.Brush = routeBrush;
                    g.DrawLine(routePen, ps[prevI], ps[i]);
                }
            }
            GC.Collect();
        }
    }
}

【问题讨论】:

  • 我有 64 位的。
  • 你能展示一下draw函数的代码吗?
  • 你应该粘贴一些代码。在那之前我能做的就是同意你的调试器。
  • 让我猜猜:你不是在刷子上调用Dispose() 还是使用using 块?
  • 没错。我不知道我需要这样做。谢谢。我试试看。

标签: c# winforms memory-leaks drawing


【解决方案1】:

不幸的是,System.Drawing 可以抛出 OutOfMemory 异常,即使错误与内存无关。

我看到人们在以下情况下遇到该异常: * 使用 LinearGradientBrush 填充尺寸为 0 的矩形 * 尝试加载损坏的图像文件

这些异常来自 GDI+,所以我建议寻找内部异常和日志。

【讨论】:

  • 我很好奇 - 通常是什么原因导致的?
  • this question 已经回答了 OP 的问题,您的回答似乎没有添加任何新内容...
猜你喜欢
  • 2013-03-30
  • 1970-01-01
  • 2021-05-14
  • 2020-12-23
  • 2013-03-14
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多