被调用的代码:
try
{
renderBitmap = new WicRenderTarget(DXManager.Factory, host.bmp, new RenderTargetProperties());
}
catch (Exception ex)
{
// Exists entirely so that we can set a break point to catch this on the Exception.
throw ex;
}
host.bmp 是SharpDX.WIC.Bitmap。我们偶尔会得到上面提到的“外部组件已经抛出异常”。异常,错误代码为“-2147467259”(映射到0x80004005或“未指定的错误”)和以下堆栈跟踪:
at SharpDX.Direct2D1.Factory.CreateWicBitmapRenderTarget(Bitmap target, RenderTargetProperties& renderTargetProperties, RenderTarget renderTarget)
at SharpDX.Direct2D1.WicRenderTarget..ctor(Factory factory, Bitmap wicBitmap, RenderTargetProperties renderTargetProperties)
at MyCompany.Framework.DirectX.DXRenderableImage.Surface..ctor(DXRenderableImage Target, PointF NewOrigin, Color BackgroundColor) in Source ....\\Framework\\DirectX\\DXImageSurface.cs:line 150
DXRenderableImage.Surface构造函数的代码是问题顶部提到的代码,它基本上只调用WicRenderTarget构造函数。
据我所知,工厂很好。当我们快速连续处理相当复杂的页面时,会发生此异常,从而生成用于保存页面的预览缩略图。我们的线程保存逻辑应该一次只调用一次,所以这应该是门控的。这可能与难以获得渲染锁定有关(我们已经在类似情况下看到了不同的例外情况)。
我对如何进行调试感到困惑。该例外没有任何支持信息,否则一切似乎都是有序的。有没有人要么对我有答案,要么找到解决方法?
答案 0 :(得分:1)
我将此作为答案而不是评论重新发布。
<强>首先强> 0x80004005错误通常表示访问被拒绝/锁定情况。你认为你正在加载的图像(host.bmp)可能被锁定在两个线程之间吗?你检查过你的方法是否是线程安全的吗?你应该在将它们读入内存后释放任何已加载的图像。
<强>其次强> 你可能没有得到内部异常,因为你使用“throw ex”来重新抛出异常会占用你的堆栈跟踪。最好只使用“throw”来保留堆栈跟踪。
答案 1 :(得分:0)
使用完毕后,您是否尝试过处置物品?这可能是内存泄漏。您可以在try / catch中添加finally块并在其中调用Dispose()
finally
{
renderBitmap.Dispose();
}
或使用
using (renderBitmap = new WicRenderTarget(DXManager.Factory, host.bmp, new RenderTargetProperties()))
{
// do the stuff you want with the render-bitmap
}