-2

使用 Visual C# 2008 Exp Edition,我注意到加载我的项目后,该进程消耗了大约 70,000K 的内存。几个小时后,它会增加到大约 500,000K。

此时 aUserControl包含 a PictureBox(在 a 内Panel)显示 Visual C# Express 中的内存错误。图片框包含一个位图和矩形网格,用System.Drawing.Graphics.

这是代码:

这个段在初始化时只发生一次UserControl

Bitmap myBitmap = new Bitmap(a, b);
Graphics g = null;
g = Graphics.FromImage(myBitmap);
g.FillRectangle(Brushes.SteelBlue, 0, 0, c, d);

//Paint Rows & Columns
for (int x = 0; x <= e - 1; x++)
{
    for (int y = 0; y <= f - 1; y++)
    {
        g.DrawRectangle(Pens.LightBlue, g, h, i);
    }
}
//Release Resources
g.Dispose();
//Add bitmap with grid to BG
ScorePictureBox.Image = myBitmap;

这段代码相当频繁:

for (int EventIndex = 0; EventIndex <= MidiNoteDownArray.Length - 1; EventIndex++)
{
    //Paint notes to grid

    e.Graphics.FillRectangle(Brushes.LightBlue, j, k, l, m);
    e.Graphics.DrawRectangle(Pens.Purple, o, p, q, r);
}
e.Dispose();

我没有正确释放资源吗?我怎样才能正确地做到这一点?

4

2 回答 2

2

检查你的项目。也许您缺少参考。

于 2012-05-07T01:01:01.623 回答
1

这可能是您正在创建的位图 - 当您替换 上的图像时ScorePictureBox,您需要处理旧的,即:

var oldImage = ScorePictureBox.Image;
//Add bitmap with grid to BG
ScorePictureBox.Image = myBitmap;
// Dispose of previous score image if necessary
if (oldImage != null) oldImage.Dispose();

请注意双重处理 - 通常最好不要在其他项目仍在引用它们时处理 GDI+ 对象。

在一般的语法说明上,您可能最好使用using语句而不是显式调用Dispose(),即:

using (Graphics g = Graphics.FromImage(myBitmap))
{
   ...
}
于 2012-05-07T02:20:31.130 回答