1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

C# PictureBoxのメモリをdisposeする

Posted at

C# .NET Frameworkを利用してスライドショーなど複数の画像を切り替えながら継続的に表示する場合、適切にDisposeしてあげないとメモリリークを起こしてしまいます。過去にこの件を調べたところDisposeを書く場所を間違えたことがあったのでここに書き残します。今回は手っ取り早く多くの画像の切り替えを行うためOnPaintに入れて画像を切り替えていきます。
pathlstには画像のpathが入っていてcurrentの数値を変えることで画像を切り替えます。

###なにもDisposeしない場合

Form1.cs
protected override void OnPaint(PaintEventArgs e)
        {
            if (current >= pathlst.Count())
            {
                current = 0;
            }           

            Image img =  Image.FromFile(pathlst[current]);
            pictureBox1.Image = img;            
            pictureBox1.Update();

            current++;
            Invalidate();
        }

image.png
9秒4GB使いメモリ不足を起こしました。

###Image.FromFileの代わりにFileStreamを使う

Form1.cs
System.IO.FileStream fs1 = new System.IO.FileStream(pathlst[current],
                                        System.IO.FileMode.Open, System.IO.FileAccess.Read);
pictureBox1.Image = System.Drawing.Image.FromStream(fs1);
fs1.Close();

image.png
たまにGCが呼ばれたりしているのでひどいリークは起こしていないように思えます。

###PictureBoxのImageをDisposeする

Form1.cs
if (pictureBox1.Image != null)
{
      pictureBox1.Image.Dispose();
}
Image img =  Image.FromFile(pathlst[current]);
pictureBox1.Image = img;

PictureBoxに前の画像が入っていた場合その画像をDisposeしてあげればリークを起こしません。はじめは22MB程度で、18秒経過後も30MBあたりに収まっています。

image.png

Disposeは後に書いてはダメで

Form1.cs
System.IO.FileStream fs1 = new System.IO.FileStream(pathlst[current], System.IO.FileMode.Open, System.IO.FileAccess.Read);
pictureBox1.Image = System.Drawing.Image.FromStream(fs1);
fs1.Close();
pictureBox1.Image.Dispose();

前に書いてもnullかどうか調べてからではないとエラーを起こします。

Form1.cs
pictureBox1.Image.Dispose();
System.IO.FileStream fs1 = new System.IO.FileStream(pathlst[current], System.IO.FileMode.Open, System.IO.FileAccess.Read);
pictureBox1.Image = System.Drawing.Image.FromStream(fs1);
fs1.Close();
1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?