c# - 尝试更改图片框中的图像时 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();
}
}
解决方案
您可以添加以下方法:
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)
推荐阅读
- r - export::graph2office 移动轴标签
- swiftui - SwiftUI 列表背景颜色
- amazon-web-services - CloudWatch 代理 CPU 收集的指标未显示
- powershell - 将文档库移动到 SharePoint 中的子网站
- python - 类的递归定义[python]
- makefile - 同时运行同一 C++ 程序的两个实例
- redis - 通过 Lua 在 Redis 中设置多个键
- file - 是否有任何反取证技术无法进行文本解析
- mysql - “当前选择不包含唯一列” - 无法在网格框中编辑
- java - 使用 Spring 微服务从 Kubernetes 集群中的服务中提取配置映射