2014-11-21 12 views
1

Так что я в настоящее время работаю над resizer, который работает/работал очень хорошо, но, за исключением того, что он дал мне OutOfMemoryException, когда я обрабатывал слишком много изображений сразу, сбой программы.Bitmap ArgumentException после возвращения в оператор using

Итак, чтобы исправить это, я обернул методы внутри оператора using, чтобы растровые изображения можно было правильно расположить.

Однако я заметил, что если я возвращаю мой Bitmap внутри с помощью заявления я получаю это «ArgumentException было необработанное» сообщение

Вот мой метод ImageResize:

public Bitmap ResizeImage(MemoryStream ms, Size size) 
    { 
     if (comboBox2.Text == "Pixel") 
     { 
      using (Bitmap img = new Bitmap(new Bitmap(ms, true), size.Width, size.Height)) 
      { 
       var original = new Bitmap(ms, true); 
       Graphics graphic = Graphics.FromImage(img); 

       //IRRELEVANT CODE..... 

       return img; 
      } 
     } 
     else 
     { 
      return null; 
     } 

А вот когда я пытаюсь сохранить мое изображение вне метода ImageResize:

private void button1_Click(object sender, EventArgs e) 
    { 
    //IRRELEVANT CODE ... 
    img = ResizeImage(memory, new Size(getX(), getY())); 
    //IRRELEVANT CODE ... 
    img.Save(outputFileName, codec, encoderParams); //<-Exception occurs here 
    } 

Когда я удалить, используя оператор все отлично работает снова, однако я должен использовать ю используя блоки для размещения растрового изображения и для предотвращения утечки памяти. Также, когда я сохраняю изображение внутри оператора using, он отлично работает, но это не решение в моем случае.

Что я делаю неправильно? Мне кажется, что битмап не возвращается правильно.

Я признателен за любую помощь и заранее спасибо Ravand

+0

Мне нравится комментарий '// IRRELEVANT CODE ...'. Он принадлежит [этой теме] (http://stackoverflow.com/q/184618/2596334). –

+0

Hahaha опубликуйте его, если хотите: D, но, честно говоря, это не имеет значения в этом случае. – Ravand

ответ

0

Ok я, наконец, решена проблема с утечкой памяти, оказалось, что я был действительно отпуская/расположени изображения, но это не делает это достаточно быстро который вызвал это outOufMemoryException, когда вы обрабатывали много очень больших изображений сразу после другого. Я попытался сделать все многопоточность и всегда ждать, пока WorkSet станет меньше без успеха.

Оказалось, что это было легче, чем я thhought, все, что я должен был сделать, это положить это в конце моего метода изменения размера:

GC.Collect(); 
GC.WaitForPendingFinalizers(); 
System.Threading.Thread.SpinWait(5000); 

И это, кажется, делает магию для изменения размера больших изображений с 10- 20 МБ и 10000х10000 для разрешения. Может кто-нибудь может объяснить, почему SpinWait помогает, но не нормальный сон сна? Всякий раз, когда я пробовал спящий поток, он также, казалось, сбрасывал освобождение памяти.

5

вы кладете использование в неправильном месте. После окончания используемого блока (который включает в себя возврат из него) объект, управляемый блоком, расположен. Доступ к размещенному растровому изображению является ошибкой.

Вы используете потребности быть здесь вместо:

private void button1_Click(object sender, EventArgs e) 
{ 
    //IRRELEVANT CODE ... 
    using(img = ResizeImage(memory, new Size(getX(), getY()))) 
    { 
     //IRRELEVANT CODE ... 
     img.Save(outputFileName, codec, encoderParams); 
    } 
} 
+0

Предоставьте более подробную информацию о не очень подходящем коде или просто ограничьте количество изображений, которые вы обрабатываете одновременно. –

+0

Ой, я прошу прощения, я не получил MemoryException, но у меня появилось исключение ArgumentException, которое я получил в событии нажатия кнопки в методе ResizeImage ... так что добрый, я вернулся обратно туда, где я начал – Ravand

+0

1. Вы удалили 'использование' в' ResizeImage'? 2. За какой аргумент? –

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

  • Нет связанных вопросов^_^