6

この行でアプリケーションのメモリ リークが発生しました。タスク マネージャを見ると、このプロセスがトリガーされるたびに、RAM メモリが +- 300 MB ずつ増加しています。

Bitmap bmp1 = new Bitmap(2480, 3508);
panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));
pictureBox2.Image = bmp1;

誰かが彼のリークを手伝ってくれますか? 私が使用する場合:

bmp1.Dispose();

「Program.cs」の次の行で例外が発生します。Application.Run(new Form1()); この後、アプリケーションの実行が停止されます...

スクリーンの適用: ここに画像の説明を入力

4

4 に答える 4

15

更新:メモリ リーク自体はありません。ガベージ コレクターがリソースを解放するのを待つだけです。

ただし、ガベージ コレクターを作成したい場合は、次のcollectようにすることができます。

System.GC.Collect();
System.GC.WaitForPendingFinalizers();

なぜビットマップを破棄する必要があるのですか? PictureBox がそれを使用している場合は、ビットマップが必要です。頻繁に変更する場合は、古いビットマップを新しいビットマップに切り替えて、古いビットマップを破棄する必要があります。

Bitmap bmp1 = new Bitmap(2480, 3508);
panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));
Image img = pictureBox1.Image;
pictureBox1.Image = bmp1;
if (img != null) img.Dispose(); // this may be null on the first iteration
于 2013-02-19T12:49:41.220 に答える
4

もう必要のない画像だけを処分するべきだと思います。あなたはまだ作成されたものが必要です。フィールドbmp1のコンテンツになるように設定するだけです。pictureBox2.Imageこれらの行に沿って何かを試してください:

Bitmap bmp1 = new Bitmap(2480, 3508);
panel1.DrawToBitmap(bmp1, new Rectangle(0, 0, 2480, 3508));
Bitmap bmp2 = (Bitmap)pictureBox2.Image;
pictureBox2.Image = bmp1;
bmp2.Dispose();

免責事項: 私は C# の経験がないため、間違っている可能性があります...

于 2013-02-19T12:52:59.050 に答える
-1
    Bitmap copy_Screen()
    {
        try
        {
            var bmpScreenshot = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb);
            var gfxScreenshot = Graphics.FromImage(bmpScreenshot);
            try
            {
                gfxScreenshot.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
            }
            catch (Exception) { }
            return bmpScreenshot;
        }
        catch (Exception) { }
        return new Bitmap(10, 10, PixelFormat.Format32bppArgb);
    }

    private void button5_Click(object sender, EventArgs e)
    {
        //Start Stop timer
        if (timer1.Enabled == false) { timer1.Enabled = true; } else { timer1.Enabled = false; }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        //memory leak solve
        System.GC.Collect();
        System.GC.WaitForPendingFinalizers();

        Bitmap BM = copy_Screen();
        if (pictureBox1.Image != null)
        {
            pictureBox1.Image.Dispose();
        }
        pictureBox1.Image = BM;

    }
于 2016-02-28T17:26:15.030 に答える