1

Visual C# 2008 Exp Edition を使用して、プロジェクトをロードすると、プロセスが最大 70,000K のメモリを消費していることに気付きました。数時間後、これは約 500,000K まで増加します。

この時点で( 内に)UserControlを含む は、Visual C# Express のメモリ エラーを示しています。画像ボックスには、 で描画されたビットマップと長方形のグリッドが含まれています。PictureBoxPanelSystem.Drawing.Graphics

コードは次のとおりです。

このセグメントは、 のUserControl初期化時に 1 回だけ発生します。

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

1 に答える 1

4

ビットマップを解放していません。コードの実行頻度によっては、ガベージ コレクターが追いつかない場合があります。

using (Bitmap myBitmap = new Bitmap(a, b))
using (Graphics g = Graphics.FromImage(myBitmap)) {
    for (int x = 0; x <= e - 1; x++) {
        for (int y = 0; y <= f - 1; y++) {
            g.DrawRectangle(Pens.LightBlue, g, h, i);
        }
    }

    ScorePictureBox.Image = myBitmap;
}

未リリースのリソースに対して GDI を使用するコードの他の部分も確認する必要があります。

于 2012-04-19T05:48:13.297 に答える