在MVC中使用System.Windows.Media.Imaging导致"操作成功完成"错误

时间:2015-05-04 16:40:03

标签: c# asp.net asp.net-mvc wpf gdi

我们正在使用WPF库来调整上传到MVC操作的图像的大小,并且我们会定期收到错误消息,说明"操作已成功完成"。错误发生在"新的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进程的句柄数量大约为35k。线程数约为270," GDI"我已经尝试强制调度程序在BitmapFrame.Create(目标)之后启动关闭,并且还添加了GC代码,但这些似乎没有任何区别。现在唯一的解决方案是回收应用程序池。

我已经完成了一些谷歌搜索,而且我所看到的主要是针对桌面应用程序或WPF XAML控件的WPF应用程序。请注意,如果您想查看调用此方法的任何代码,我可以提供。我基本上使用了几个任务来同时创建了许多已调整大小的版本,并且我正在使用" await"观察他们完成。我也尝试过处理这项任务,而且似乎根本没有做任何事情。

编辑:我们还看到了一个错误,上面写着"没有足够的存储空间来处理此命令"有时会出现在"流程成功完成之前"错误。

0 个答案:

没有答案