Показать сообщение отдельно

  #499  
Старый 02.06.2010, 01:43
Bers
Новичок
Регистрация: 17.05.2010
Сообщений: 5
С нами: 8414959

Репутация: 10
По умолчанию

Цитата:
Сообщение от eLWAux  
C#: написал класс для ресайза изображений: http://paste.ly/1sy
Класс жрет много памяти, при работе в многопоточном режиме..
Глянул код, сразу бросилось в глаза:
Код:
try
{
  // ...
 Graphics oGraphic = Graphics.FromImage(...);
  // ...
  oGraphic.Dispose();
  // ...  
  return oThumbNail;
}
catch (Exception)
{
   return oImg;
}
Перепиши с использованием оператора using:
Код:
try
{
  // ...
 using(Graphics oGraphic = Graphics.FromImage(...))
  {
    // ...
    return oThumbNail;
  }
}
catch (Exception)
{
   return oImg;
}
В твоем коде возможна ситуация, когда Dispose() не будет вызван, что вообще грубейшая ошибка. Классы из System.Drawing являются обертками над функциями GDI, т.е. работает с неуправляемыми ресурсами, поэтому эти ресурсы следует корректно высвобождать. Возможно, у тебя имеет место утечка памяти.
Насчет потоков - не ясно, как ты ими управляешь (создаешь сам, используешь пул потоков), но вообще GDI не гарантирует потокобезопасности, она предназначена для работы в одном потоке, для отрисовки GUI. Возможно, это также вызывает проблемы в твоем случае. Советую переписать твой класс с использованием классов из WPF, они не привязаны к GDI.
Ну и напоследок посоветую погонять приложение под отладчиком и под профайлером, это тоже может дать полезную информацию для расмышления.
Удачи!

Последний раз редактировалось Bers; 02.06.2010 в 01:47..
 
Ответить с цитированием