System.Drawing.dll 中的 C# 内存不足异常

C# out of memory Exception in System.Drawing.dll

我使用 C# 制作了一个幻灯片,代码 运行 很好并且没有给我任何错误,但是当我在 30-60 秒后点击播放按钮时它停止并给我内存不足异常 System.Drawing.dll。有解决这个问题的想法吗?谢谢

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Slide_Show
{
    public partial class SlideShow : Form
{
    public SlideShow()
    {
        InitializeComponent();
        if (timer.Interval < 200)
        {
            timer.Interval = 100;
        }
        else if(timer.Interval > 8000)
        {
            timer.Interval = 600;
        }
        else{
            timer.Interval = 2000;
        }
    }
    string dir;
    private void btnImagesSelection_Click(object sender, EventArgs e)
        {
        FolderBrowserDialog asked = new FolderBrowserDialog();
        if (asked.ShowDialog() == DialogResult.OK)
        {
            string folName = asked.SelectedPath;
            foreach (string fullfol in Directory.GetFiles(folName))
            {
                dir = fullfol.Substring(0, fullfol.LastIndexOf(("\")));
                picImages.Image = Image.FromFile(fullfol);
                lstImages.Items.Add(Path.GetFileName(fullfol));
                lblNum.Text = lstImages.Items.Count.ToString() + "/" + lstImages.Items.Count.ToString();
            }
        }

    }

    private void lstImages_SelectedIndexChanged(object sender, EventArgs e)
    {
        string curitem = lstImages.SelectedItem.ToString();
        picImages.Image = Image.FromFile(dir+"\"+curitem);
        lblNum.Text = (lstImages.SelectedIndex+1).ToString() + "/" + lstImages.Items.Count.ToString();
    }
    bool flip = true;
    int i = 0;
    private void btnPlay_Click(object sender, EventArgs e)
    { 
        timer.Start();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(timetick);
    }
    void timetick(object sender, EventArgs e)
    {

        int numitems = lstImages.Items.Count;
        if (flip)
            if (i < numitems)
            {
                try
                {
                    lblNum.Text = (i + 1) + "/" + numitems;
                    picImages.Image = Image.FromFile(dir + "\" + lstImages.Items[i].ToString());
                    i += 1;
                }
                catch
                {
                    timer.Stop();
                }
            }
            else if (i == numitems)
            {
                i = 0;
            }
        flip = !flip;
    }

    private void btnSlow_Click(object sender, EventArgs e)
    {
        try
        {
            timer.Interval *= 2;
        }
        catch
        {
            timer.Interval = 6000;
        }
    }

    private void btnFast_Click(object sender, EventArgs e)
    {
        try
        {
            timer.Interval /= 2;
        }
        catch
        {
            timer.Interval = 100;
        }

    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        timer.Stop();
    }

}

}

Image class 将图像数据作为非托管资源保存。这些资源无法通过 Garbage Collector 卸载,内存将在您调用 Dispose 方法或通过 finalization 时释放。完成处理速度太慢,无法处理大量图像,因此每次加载新图像时都应处理旧图像。

private void LoadNewImage(string path)
{
    var oldImage = picImages.Image;
    picImages.Image = Image.FromFile(dir+"\"+curitem);
    if(oldImage!= null)
    {
        oldImage.Dispose();
    }
}