首页 > 解决方案 > 尝试更改图片框中的图像时 C# Out of Memory

问题描述

我一直在用 C# 乱涂乱画,为室内广告风格的电视等设计幻灯片程序。

基本上我有一个表单,它最初将值带到一个带有几个 jpg 的网络文件夹,然后运行一个设置函数以从目录路径获取文件,然后启动 2 个计时器。1个定时器是一个旋转图像定时器。另一个是更新计时器,以重新检查文件夹中的文件是否已更改。

它试图在我的旋转滴答计时器函数中设置图片图像的所有内容都会引发“内存不足”异常(在第一个“滴答”上)。

我已经尽可能多地进行了研究,我对它为什么内存不足感到有点迷茫,我的机器有足够的物理内存,而且程序对我来说似乎并不重。

任何方向都是有价值的。

代码如下。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Collections;

namespace MarketingImagesSS
{
    public partial class Slideshow : Form
    {
        public Menu frmMenu { get; set; }

        int counter = 0;
        string[] images;
        Image image;
        public Slideshow()
        {
            InitializeComponent();
        }

        private void tmrUpdate_Tick(object sender, EventArgs e)
        {

        }

        private void tmrRotate_Tick(object sender, EventArgs e)
        {
            pxbxImages.Image.Dispose();
            image = Image.FromFile(images[counter]);
        }

        private void setup(string directory)
        {
            images = Directory.GetFiles(directory);
            image = Image.FromFile(images[counter]);
            pxbxImages.Image = image;
            counter++;
        }

        public void Slideshow_Load(object sender, EventArgs e)
        {
            string directoryPath = frmMenu.fPath;
            setup(directoryPath);
            //tmrUpdate.Start();
            tmrRotate.Start();
        }

        private void pxbxImages_DoubleClick(object sender, EventArgs e)
        {
            Close();
        }
    }

标签: c#exceptionout-of-memory

解决方案


您可以添加以下方法:

     bool IsValidImg(string filename)
    {
        try
        {
            using (Image newImg = Image.FromFile(filename))
            { }
        }
        catch (OutOfMemoryException ex)
        {
            return false;
        }
        return true;
    }

然后在您的代码中添加此条件(如果 image.fromfile 工作正常):

     private void tmrRotate_Tick(object sender, EventArgs e)
    {
        if (IsValidImg(images[counter])) <--- img exist condition
             image = Image.FromFile(images[counter]);    

为了防止从数组异常中获取索引,您还需要确保计数器不超过目录路径中图像的计数:

       if (IsValidImage(images[counter]) &&  images.Length<=counter)

推荐阅读