Вы не вызываете Dispose для ваших экземпляров Image. Также создайте свое изображение один раз, а затем извлеките данные.
Смотри также:
http://msdn.microsoft.com/en-us/library/8th8381z.aspx
EDIT
Если скопировал ваш код и протестировал его с моей библиотекой изображений. Мой средний Размер файла составляет 2-3 МБ на файл. Я выполнил вашу программу, и она сделала именно то, что и должна. GC сделал именно то, что я ожидал.
Объем памяти вашей Программы всегда составлял 11-35 МБ. Частный рабочий набор, размер фиксации был стабильным и составлял 43 МБ.
Я прервал программу после 1156 файлов с общим размером изображения 2,9 ГБ.
Так что должна быть еще одна причина для исключения нехватки памяти.
Вот мой вывод программы и код:
1133: Total Size = 2.842,11 MB
1134: Total Size = 2.844,88 MB
1135: Total Size = 2.847,56 MB
1136: Total Size = 2.850,21 MB
1137: Total Size = 2.853,09 MB
1138: Total Size = 2.855,86 MB
1139: Total Size = 2.858,59 MB
1140: Total Size = 2.861,26 MB
1141: Total Size = 2.863,65 MB
1142: Total Size = 2.866,15 MB
1143: Total Size = 2.868,52 MB
1144: Total Size = 2.870,93 MB
1145: Total Size = 2.873,64 MB
1146: Total Size = 2.876,15 MB
1147: Total Size = 2.878,84 MB
1148: Total Size = 2.881,92 MB
1149: Total Size = 2.885,02 MB
1150: Total Size = 2.887,78 MB
1151: Total Size = 2.890,57 MB
1152: Total Size = 2.893,55 MB
1153: Total Size = 2.896,32 MB
1154: Total Size = 2.898,92 MB
1155: Total Size = 2.901,48 MB
1156: Total Size = 2.904,02 MB
Исходник:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Drawing;
namespace SharpLibrary_MediaManager
{
public abstract class BaseFile
{
public string Name { get; set; }
public string FileType { get; set; }
public long Size { get; set; }
public DateTime CreationDate { get; set; }
public DateTime ModificationDate { get; set; }
public abstract void getFileInformation(string filePath);
}
public class Picture : BaseFile
{
public int Height { get; set; }
public int Width { get; set; }
public Image Thumbnail { get; set; }
public override void getFileInformation(string filePath)
{
FileInfo fileInformation = new FileInfo(filePath);
using (var image = Image.FromFile(filePath))
{
if (fileInformation.Exists)
{
Name = fileInformation.Name;
FileType = fileInformation.Extension;
Size = fileInformation.Length;
CreationDate = fileInformation.CreationTime;
ModificationDate = fileInformation.LastWriteTime;
Height = image.Height;
Width = image.Width;
Thumbnail = image.GetThumbnailImage(40, 40, null, new IntPtr());
}
}
}
}
class Program
{
static void Main(string[] args)
{
string folderPath = @"C:\Users\arthur\Pictures";
DirectoryInfo folder = new DirectoryInfo(folderPath);
List<Picture> lol = new List<Picture>();
double totalFileSize = 0;
int counter = 0;
foreach (FileInfo x in folder.GetFiles("*.jpg", SearchOption.AllDirectories))
{
Picture p = new Picture();
p.getFileInformation(x.FullName);
lol.Add(p);
totalFileSize += p.Size;
Console.WriteLine("{0}: Total Size = {1:n2} MB", ++counter, totalFileSize / 1048576.0);
}
foreach (var p in lol)
{
Console.WriteLine("{0}: {1}x{2} px", p.Name, p.Width, p.Height);
}
}
}
}