Использование System.Windows.Media.Imaging в MVC приводит к ошибке "Операция завершена успешно"
Мы используем библиотеки WPF для изменения размера изображений, загружаемых в действие MVC, и периодически получаем сообщение об ошибке "Операция успешно завершена". Ошибка происходит в строке "new DrawingVisual()" в приведенном ниже коде.
public static BitmapFrame ResizeWithExcess(this BitmapFrame photo, int width, int height)
{
double dpiX = photo.DpiX == 0 ? 96 : photo.DpiX;
double dpiY = photo.DpiY == 0 ? 96 : photo.DpiY;
var targetVisual = new DrawingVisual();
using (var targetContext = targetVisual.RenderOpen())
{
targetContext.DrawRectangle(Brushes.White, null, new Rect(0, 0, width * 96 / dpiX, height * 96 / dpiY));
var x = ((width - (photo.Width * dpiX / 96)) / 2) * 96 / dpiX;
var y = ((height - (photo.Height * dpiY / 96)) / 2) * 96 / dpiY;
var w = photo.Width;
var h = photo.Height;
targetContext.DrawImage(photo, new Rect(x, y, w, h));
targetContext.Close();
}
var target = new RenderTargetBitmap(width, height, dpiX, dpiY, PixelFormats.Default);
target.Render(targetVisual);
var targetFrame = BitmapFrame.Create(target);
if (targetVisual.Dispatcher != null) targetVisual.Dispatcher.InvokeShutdown();
return targetFrame;
}
По словам диспетчера задач, число дескрипторов процесса w3wp составляет около 35 тыс., Когда это происходит. Количество потоков составляет около 270, а "GDI" равно 0. Я пытался заставить диспетчер инициировать выключение после BitmapFrame.Create(target), а также добавил код GC, но ни один из них, похоже, не имеет значения. Сейчас единственное решение - перезапустить пул приложений.
Я немного погуглил, и в основном то, что я видел, это приложения WPF, которые являются настольными приложениями, или элементы управления WPF XAML. Обратите внимание, что если вы хотите увидеть какой-либо код, который вызывает этот метод, я могу предоставить его. Я в основном использую несколько задач, чтобы создать много версий с измененным размером одновременно, и я использую "ожидание", чтобы наблюдать за их завершением. Я также пытался избавиться от задачи, но это, похоже, ничего не делало.
РЕДАКТИРОВАТЬ: Мы также видели ошибку, которая говорит: "Недостаточно памяти для обработки этой команды" иногда возникает непосредственно перед потоком ошибок "Операция успешно завершена".