2017-06-15 56 views
1

代碼時異常被稱爲:「外部組件已引發異常。」調用WicRenderTarget

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

這個異常是否有內部異常?內部異常有什麼信息? –

+0

@ChetanRanpariya:沒有內在的例外。 –

+1

與你的問題無關,但重新拋出異常,你不應該使用「扔前」這會吃掉你的堆棧跟蹤。最好使用「throw」來保留你的堆棧跟蹤。 – Gurpreet

回答

0

當你使用它們的時候,你有沒有試過處理你的對象?這可能是內存泄漏。您可以在它

finally 
{ 
    renderBitmap.Dispose(); 
} 

一個finally塊添加到您的try/catch和調用Dispose()或使用使用

using (renderBitmap = new WicRenderTarget(DXManager.Factory, host.bmp, new RenderTargetProperties())) 
{ 
    // do the stuff you want with the render-bitmap 
} 
+0

:)一個小問題... renderBitmap需要通過構造函數持久化。但是,是的,我們在課程處理完畢時會調用Dispose。 –

1

我重新張貼這作爲一個答案,而不是評論。

首先 0x80004005的錯誤通常表示拒絕訪問/鎖定的情況。你認爲你正在加載的圖像(host.bmp)可能在兩個線程之間被鎖定?你有沒有檢查你的方法是否線程安全?你應該在讀入內存後釋放所有加載的圖像。

其次 你可能不是因爲你使用的是「扔恩」重新拋出異常,這將吃掉你的堆棧跟蹤獲取內部異常。最好使用「throw」來保留你的堆棧跟蹤。

+0

你的問題是更好的答案,但它仍然不能解決我如何解決這個問題。 –

+0

我能做些什麼來幫助的是審查一些代碼,看看我能否找到重構和嘗試的東西。我不知道你是否可以通過git hub或其他東西共享一些代碼。 – Gurpreet

相關問題