Использование 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. Обратите внимание, что если вы хотите увидеть какой-либо код, который вызывает этот метод, я могу предоставить его. Я в основном использую несколько задач, чтобы создать много версий с измененным размером одновременно, и я использую "ожидание", чтобы наблюдать за их завершением. Я также пытался избавиться от задачи, но это, похоже, ничего не делало.

РЕДАКТИРОВАТЬ: Мы также видели ошибку, которая говорит: "Недостаточно памяти для обработки этой команды" иногда возникает непосредственно перед потоком ошибок "Операция успешно завершена".

0 ответов

Другие вопросы по тегам