2012-04-10 93 views
1

有誰知道什麼會導致WPF應用程序出現以下異常?在Windows 7 x64上部署後開始發生。應用程序正在使用.NET 3.5,並且沒有導致這種情況的具體操作,並且應用程序運行的時間長度是隨機的。WPF應用程序在Win7 x64上部署時內存不足

Message : Insufficient memory to continue the execution of the program. 
Source : PresentationCore 
Help link : 
Data : System.Collections.ListDictionaryInternal 
TargetSite : Boolean CreateOrAddRefOnChannel(ResourceHandle ByRef, ResourceType) 
Stack Trace : at System.Windows.Media.Composition.DUCE.Channel.CreateOrAddRefOnChannel(ResourceHandle& handle, ResourceType resourceType) 
    at System.Windows.Media.Composition.DUCE.MultiChannelResource.CreateOrAddRefOnChannel(Channel channel, ResourceType type) 
    at System.Windows.Media.RenderData.System.Windows.Media.Composition.DUCE.IResource.AddRefOnChannel(Channel channel) 
    at System.Windows.UIElement.RenderContent(RenderContext ctx, Boolean isOnChannel) 
    at System.Windows.Media.Visual.UpdateContent(RenderContext ctx, VisualProxyFlags flags, Boolean isOnChannel) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.UpdateChildren(RenderContext ctx, ResourceHandle handle) 
    at System.Windows.Media.Visual.RenderRecursive(RenderContext ctx) 
    at System.Windows.Media.Visual.Render(RenderContext ctx, UInt32 childIndex) 
    at System.Windows.Media.CompositionTarget.Compile(Channel channel) 
    at System.Windows.Media.CompositionTarget.System.Windows.Media.ICompositionTarget.Render(Boolean inResize, Channel channel) 
    at System.Windows.Media.MediaContext.Render(ICompositionTarget resizedCompositionTarget) 
    at System.Windows.Media.MediaContext.RenderMessageHandlerCore(Object resizedCompositionTarget) 
    at System.Windows.Media.MediaContext.RenderMessageHandler(Object resizedCompositionTarget) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
+0

看起來像一個無限循環,恰好在發生堆棧溢出之前耗盡內存/資源。 – benPearce 2012-04-10 22:11:06

+0

錯誤是由本機代碼Milcore生成的,它是DirectX的包裝器。它是一個非常通用的錯誤代碼,E_OUTOFMEMORY,它傾向於被本機代碼用於多種原因。你的程序正在使用什麼資源,它用完了。這一切都很清楚。 – 2012-04-11 00:01:47

+0

@Hans,是的,它顯然是應用程序用完了資源。在32位版本的Windows上運行時,此相同的應用程序永遠不會耗盡資源。這是一個複雜的應用程序,它利用了大量的資源,所以我猜測通過編譯迫使它在WOW64下以32位進程運行會引入一些這些問題。尤其是考慮到WOW64帶來的內存和性能開銷。我正在使用任何CPU編譯應用程序以查看它的執行情況。我懷疑我們不會看到這些問題。 – 2012-04-15 18:42:35

回答

2

我發現至少有一個這個問題的原因。如果DataGrid放置在容器中,如StackPanel允許子控件無限調整大小,那麼當綁定大型列表(對於我17k行)時,會出現OutOfMemoryException。

如果您將DataGrid放置在一個固定高度的容器(如Grid)中,那麼它工作正常。諷刺的是,我通過試用DevExpress WPF庫發現了這一點。在這種情況下,它們的網格實際上會拋出一個異常,並帶有以下文本

型「DevExpress.Xpf.Grid.InfiniteGridSizeException」的第一次機會異常出現在DevExpress.Xpf.Grid.v13.2.Core.dll 附加信息:默認情況下,無限電網高度是不允許的,因爲所有網格行將被渲染,因此網格將工作得非常緩慢。要解決這個問題,你應該把網格放到一個容器中,這個容器將給網格一個有限的高度,或者你應該手動指定網格的Height或MaxHeight。請注意,您還可以通過將GridControl.AllowInfiniteGridSize靜態屬性設置爲True來避免此異常,但在這種情況下,網格將緩慢運行。

一旦我看到這一分錢下降,我可以複製,然後修復與Microsoft DataGrid的原始行爲。