2012-04-16 6 views
2

У меня возникли проблемы с использованием ImageList для моего ListView в приложении .net. В моей реализации этот ImageList может содержать несколько тысяч изображений в зависимости от использования. Проблема возникла, когда я пытался работать с большим количеством изображений. Когда я получал изображения 5K +, я столкнулся с общим понятием «Изображение не может быть добавлено в исключение ImageList», пытаясь добавить изображение. Точное число, в котором произошел этот сбой, немного подскочило.Ошибка в ImageList в реализации .NET ImageList?

Итак, пытаясь решить эту проблему, я попытался расширить емкость ImageList, используя собственную функцию ImageList_SetImageCount. Это было прекрасно и решило мою непосредственную проблему. Мне пришлось заполнить список, используя образ ImageList [index] = вместо метода .Add(). Все было в порядке, но когда пришло время вытащить изображение, проблемы заполнились. Теперь, когда я ссылаюсь на изображение в этом ImageList по индексу, я получаю исключение из памяти. Растровое изображение x = ImageList [любой индекс] сработает.

Я пробовал преследовать это много разных способов, и я все еще сталкиваюсь с проблемами с ImageList.

В моей последней попытке изучить проблему дальше, я собрал следующий фрагмент тестового кода, который по-прежнему ведет себя странно!

private void Form1_Load(object sender, EventArgs e) 
    { 
     list = new ImageList(); 
     list.ImageSize = new Size(128, 128); 
     list.ColorDepth = ColorDepth.Depth32Bit; 
     Image[] images = new Image[10]; 
     for (int y = 0; y < 10; y++) 
     { 
      images[y] = new Bitmap(@"Path to loading_photo.png"); 
     } 
     for (int x = 0; x < 750; x++) 
     { 
      list.Images.AddRange(images); 
     } 

     list.Images[12] = new Bitmap(@"Path to another.png"); 

Ошибка последней строки с ошибкой «Изображение не может быть добавлено к ошибке ImageList». Как ни странно, установка второго цикла для более низкой итерации (т. Е. 200 для суммирования всего 2000 изображений) ведет себя очень хорошо.

Есть ли определенный порог в ImageList в .net Я не знаю? Любая помощь будет принята с благодарностью.

+0

У меня нет опыта в этой области, но не кажется «странным», что добавление меньшего количества изображений заставляет все работать. Вы почти наверняка сталкиваетесь с проблемой памяти, поэтому использование меньше памяти было бы хорошим способом избежать этого. Вы можете просмотреть свое приложение, чтобы узнать, что такое использование вашей памяти. – dlev

+0

Я тоже об этом думал, но у меня есть концерты. Кроме того, установка этого изображения в представление списка, отображает все изображения в порядке. Это просто, когда я пытаюсь получить доступ к изображению по его индексу, чтобы отобразить его в другом месте, где возникают проблемы с памятью. Просто странно. – genus

ответ

0

При использовании отражателя, чтобы посмотреть, что ваша последняя строка кода делает, вы увидите, что законодательницей ImageList фактически неудачу на этой линии:

bool flag2 = SafeNativeMethods.ImageList_Replace(new HandleRef(this.owner, this.owner.Handle), index, new HandleRef(null, handle), new HandleRef(null, monochromeMask)); 

Она включает в себя работу с ручками, которые находятся в Windows ограничена (10000 на процесс, если я правильно помню). Поэтому, хотя у вас много свободной памяти, вы, вероятно, достигли предела в ручках.

2

Я не могу воспроизвести что-либо с опубликованным кодом. Однако важно понять, что ImageList делает копию растрового изображения. Поэтому вы должны вызвать метод Dispose() растрового изображения после его добавления. Если вы этого не сделаете, существует серьезная опасность того, что у вас закончится неуправляемая память, потребляемая растровыми данными и фатальная, когда сборщик мусора не работает достаточно часто, чтобы очистить вас после вас. Это не относится к фрагменту, так как есть только 10 растровых изображений.

Смежные вопросы