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

Dispose of a pictureBox image without losing the pictureBox

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

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

注意: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);
        }
    }

我可以向 UI 线程报告 progressChanged,但我不确定我需要从 UI 线程(如果有的话)做什么来释放旧图像。提前致谢!!

图像的数量和总大小是多少?我认为加载数组中的所有图像并将它们分配给 horPicBox 比多次加载它们更好。要使用 Dispose,首先将 horPicBox.Image 分配给临时对象,然后将 horPicBox.Image 分配给 null 或下一张图像,并在最后为临时对象调用 Dispose

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

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

       Image oldImage = horPicBox.Image;
       horPicBox.Image = Image.FromFile(imagePaths[index]);
       oldImage.Dispose();