在不丢失pictureBox的情况下处理pictureBox图像

时间:2016-09-11 19:39:13

标签: c# multithreading memory picturebox dispose

我正在编写一个播放幻灯片的程序(除其他外)。幻灯片显示由backgroundWorker控制,并设置为while(true)循环,因此它将不断播放图像。我的问题是我不知道如何处理旧图像,因此他们不会占用内存(一段时间后程序会抛出"内存不足异常)。如果我调用horPicBox.Image.Dispose(),那么它就不会让我在之后使用pictureBox。

有没有办法从内存中释放旧图像?如果我查看VS中的诊断工具,每次图像更改时内存都会上升... enter image description here

注意:ImagePaths是幻灯片显示图像的文件路径列表。

这是backgroundWorker运行的代码:

private void PlayImages()
    {
        Random r = new Random();
        int index;
        Stopwatch watch = new Stopwatch();

        while (true)
        {
            index = r.Next(imagePaths.Count);
            horPicBox.Image = Image.FromFile(imagePaths[index]);

            watch.Start();

            while (watch.ElapsedMilliseconds < 5000)
            {

            }

            watch.Stop();
            watch.Reset();

            //picWorker.ReportProgress(0);
        }
    }

我可以将progressChanged报告给UI线程,但是我不确定我需要从UI线程(如果有的话)做什么来释放旧的Image。在此先感谢!!

2 个答案:

答案 0 :(得分:4)

图片数量和总尺寸是多少?我认为最好将所有图像加载到数组中并将它们分配给horPicBox,而不是多次加载它们。要使用Dispose首先将horPicBox.Image分配给临时对象,然后将horPicBox.Image分配给null或下一个图像,并在最后为临时对象调用Dispose:< / p>

Image img = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
if ( img != null ) img.Dispose();

答案 1 :(得分:4)

如果您将图像存储到该类型的变量,然后设置您的图片框图像然后处理较旧的图像

,该怎么办?
       Image oldImage = horPicBox.Image;
       horPicBox.Image = Image.FromFile(imagePaths[index]);
       oldImage.Dispose();