在我们的Silverlight MVVM应用程序中,我们使用Silverlight Toolkit TimePicker挣扎了一段时间。使用它会停止View中使用的TimePicker被垃圾收集。当我打开和关闭相同视图的5倍时,内存中有5个View副本。
内存泄漏的前期问题我们在KeyTriggers中使用了MVVM_Light:EventToCommand。通过使用KeyTrigger的名称在后面的代码中分离触发器来解决此问题。
使用WinDbg工具,我们可以看到关闭View后,TimePicker上的View(当然还有ViewModel)也有引用。 我现在的问题是,是否有可能以某种方式分离特定的TimePicker的KeyTrigger来解决这个问题?或者,如果有人已经使用过TimePicker,还有另一种方法可以防止内存泄漏吗?
感谢您的帮助!!
PS:这是一个View的WinDbg的!gcroot命令的输出:
DOMAIN(07E099E8):HANDLE(Pinned):39b12f8:Root: 0bd74260(System.Object[])->
0ad8a2d0(System.Collections.Generic.Dictionary`2[[System.IntPtr, mscorlib],[System.Object, mscorlib]])->
0c0dc6e8(System.Collections.Generic.Dictionary`2+Entry[[System.IntPtr, mscorlib],[System.Object, mscorlib]][])->
0b6fa01c(System.Windows.Controls.Border)->
0b6fa080(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
0b6fa0cc(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])->
0b6f985c(System.Windows.Controls.Grid)->
0b6f98c0(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
0b6f9f90(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])->
0b6f9564(System.Windows.Controls.ContentControl)->
0b6f97c8(System.Collections.Generic.Dictionary`2[[System.Windows.DependencyProperty, System.Windows],[System.Windows.EffectiveValueEntry, System.Windows]])->
0b6f9814(System.Collections.Generic.Dictionary`2+Entry[[System.Windows.DependencyProperty, System.Windows],[System.Windows.EffectiveValueEntry, System.Windows]][])->
0b6f97b4(MS.Internal.ModifiedValue)->
0b6f9754(System.Windows.TemplateBindingExpression)->
0b6f61a0(System.Windows.Controls.TimeUpDown)->
0b6f874c(System.EventHandler`1[[System.Windows.Controls.UpDownParseErrorEventArgs, System.Windows.Controls.Input.Toolkit]])->
0b49f9b4(System.Windows.Controls.TimePicker)->
0b49fef4(System.Windows.DataContextChangedEventHandler)->
0b49fea0(System.Windows.Data.BindingExpression)->
0b44ff48(MyProject.ViewModel.MyViewModel)->
0b450514(GalaSoft.MvvmLight.Command.RelayCommand`1[[System.String, mscorlib]])->
0b707b1c(System.EventHandler)->
0b4a7f84(GalaSoft.MvvmLight.Command.EventToCommand)->
0b4a7c2c(System.Windows.DOCollection)->
0b4a7bcc(System.Windows.Interactivity.TriggerActionCollection)->
0b4a7b5c(Microsoft.Expression.Interactivity.Input.KeyTrigger)->
0b4a4704(System.Windows.DOCollection)->
0b4a5b8c(System.Collections.Generic.Dictionary`2[[System.Windows.DependencyObject, System.Windows],[System.Object, mscorlib]])->
0b4a84b0(System.Collections.Generic.Dictionary`2+Entry[[System.Windows.DependencyObject, System.Windows],[System.Object, mscorlib]][])->
0b4a7118(Microsoft.Expression.Interactivity.Input.KeyTrigger)->
0b4a732c(System.Collections.Generic.Dictionary`2[[System.Windows.DependencyProperty, System.Windows],[System.Windows.EffectiveValueEntry, System.Windows]])->
0b4a7378(System.Collections.Generic.Dictionary`2+Entry[[System.Windows.DependencyProperty, System.Windows],[System.Windows.EffectiveValueEntry, System.Windows]][])->
0b70f5f4(MS.Internal.ModifiedValue)->
0b4a2eb0(System.Windows.Controls.DataGrid)->
0b7059e4(System.Windows.Controls.ScrollContentPresenter)->
0b705a54(MS.Internal.Controls.ScrollData)->
0b4a2bb8(System.Windows.Controls.ScrollViewer)->
0b49b70c(System.Windows.Controls.Grid)->
0b4a8b50(System.Windows.Controls.Grid)->
0b48ebb0(System.Windows.Controls.Grid)->
0b48ec14(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
0b492f3c(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])->
0b49b4b0(System.Windows.Controls.Grid)->
0b49b514(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
0b49b560(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])->
0b493a28(System.Windows.Controls.Grid)->
0b4947a8(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
0b4aa2f4(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])->
0b498900(System.Windows.Controls.Grid)->
0b49912c(System.Collections.Generic.Dictionary`2[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]])->
0b499178(System.Collections.Generic.Dictionary`2+Entry[[MS.Internal.IManagedPeerBase, System.Windows],[System.Object, mscorlib]][])->
0b498ad4(System.Windows.Controls.TextBox)->
0b498b58(MS.Internal.CoreTypeEventHelper)->
0b498d20(System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib],[MS.Internal.CoreTypeEventHelper+EventAndDelegate, System.Windows]])->
0b498d6c(System.Collections.Generic.Dictionary`2+Entry[[System.Int32, mscorlib],[MS.Internal.CoreTypeEventHelper+EventAndDelegate, System.Windows]][])->
0b498d10(MS.Internal.CoreTypeEventHelper+EventAndDelegate)->
0b498cd8(System.Windows.Input.KeyEventHandler)->
0ae3cf10(MyProject.Views.MyView)
答案 0 :(得分:0)
Visual Studio 2010 SP1支持Silverlight的分析。你可以把我们这个有用,并充分利用它。
答案 1 :(得分:0)
尝试使用Antz内存分析器(RedGate)并分析您的应用。它将为您提供所需的所有信息,以确定它为什么留在内存中。可能是事件处理程序没有得到清理?
我使用他们的分析器解决了很多内存泄漏问题。你必须清理自己的东西真是太神奇了。
答案 2 :(得分:0)
使用KeyTrigger
和Popup
进行特殊内存泄漏,MS将not fix it near future。
使用Window时不会出现此问题。