我正在编写一个播放幻灯片的程序(除其他外)。幻灯片显示由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);
}
}
我可以将progressChanged报告给UI线程,但是我不确定我需要从UI线程(如果有的话)做什么来释放旧的Image。在此先感谢!!
答案 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();