Сообщение от
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.
Ну и напоследок посоветую погонять приложение под отладчиком и под профайлером, это тоже может дать полезную информацию для расмышления.
Удачи!
