Reputation: 347
I am writing a program that will play a slideshow (among other things). The slideshow is controlled by a backgroundWorker, and is set to a while(true) loop so it will constantly play images. My problem is I'm not sure how to dispose of the old images so they don't take up memory (after a while the program throws an "Out of memory exception). If I call horPicBox.Image.Dispose() then it won't let me use the pictureBox at all after that.
Is there a way to release the old image from memory?? If I look at the diagnostic tools in VS, the memory goes up each time the image changes ...
Note: ImagePaths is a List of the filepaths for the slideshow images.
This is the code the backgroundWorker runs:
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);
}
}
I can report progressChanged to the UI thread, but I'm not sure what I need to do from the UI thread (if anything) to release the old Image(s). Thanks in advance!!
Upvotes: 2
Views: 9043
Reputation: 77876
What if you store the image to variable of that type and then set your picturebox image and then dispose the older one like
Image oldImage = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
oldImage.Dispose();
Upvotes: 6
Reputation: 6563
What is the number of images and total size? I think it is better to load all images in array and assign them to horPicBox
than loading them multiple times. To use Dispose
first assign horPicBox.Image
to temp object, then assign horPicBox.Image
to null
or next image and call Dispose
at the end for the temp object:
Image img = horPicBox.Image;
horPicBox.Image = Image.FromFile(imagePaths[index]);
if ( img != null ) img.Dispose();
Upvotes: 5