在我的一个应用程序中,我遇到了无法解决的性能问题:
该应用程序使用派生自TextBox
- 类的输入控件构建,在Themes\Generic.xaml
中拥有自己的ControlTemplate。
我的问题是,这些控件在不再使用后不会被释放。如果我使用SciTech MemoryProfiler查看它们,我发现它们被System.Windows.Documents.TextEditor
的实例保留,TextEditor
- 实例通过终结器队列保持。
内存分析器向TextEditor
- 实例附加警告,说“实例间接由终结器队列生根”。
有谁知道这里发生了什么?是不是不允许直接从TextBox派生?或者我忘记了重要的事情来实施?
有关实施的其他信息:
其中一些派生控件的实现非常简单。在类构造函数中,将覆盖DefaultStyleKeyProperty的元数据,并且不会将任何事件处理程序附加到控件模板中包含的元素。类似的东西:
public class MyDerivedTextBox : TextBox{
static MyDerivedTextBox(){
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyDerivedTextBox), new FrameworkPropertyMetadata(typeof(MyDerivedTextBox)));
}
}
(简化)样式类似于:
<Style TargetType="{x:Type myApp_controls:MyDerivedTextBox}">
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="UndoLimit" Value="1"/>
<Setter Property="FocusVisualStyle" Value="{x:Null}"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type myApp_controls:MyDerivedTextBox }">
<Border Name="Border" ... >
<ScrollViewer Margin="1" x:Name="PART_ContentHost" />
</Border>
</Setter.Value>
</Setter>
</Style>
答案 0 :(得分:3)
终结者队列
关于终结器队列的问题的答案是,观察到的效果不是一个恒定的:在我分析内存的那一点上,最终确定没有完成。这里的问题是了解我使用的工具(和环境)。
内存泄漏
然而泄漏本身是一个真正的问题,事实证明它是the same thing我也在其他位置(在同一个应用程序中)观察到。 绑定到未实现INotifyPropertyChanged的类的CLR属性! http://support.microsoft.com/kb/938416/en-us
这是我的第一个WPF项目之一,与此同时它成长为一个巨大的应用程序。在我开始时,我不知道,WPF在上面提到的绑定方面存在问题,并且在开发过程中我尽可能地尝试使用数据绑定但不关心目标对象。现在,应用程序变得如此之大,客户端数量急剧增加,这些内存问题曝光(并导致非常奇怪的效果)。
在解决了最有问题的绑定之后,终结队列的效果也大大降低了。似乎之前,内存泄漏导致了对象终结的延迟执行(这只是一个假设,我没有深入研究GC行为)。
派生文字框:
我已经创建了一个带有这种派生文本框控件的小样本项目,在内存分析器中的一些压力测试中使用它们。据我对测试项目的观察,我可以从TextBoxes中得到,因为我的确能很好地工作。
<强> Fazit 强>
我只能强调在应用程序创建过程中检查Bindings的目标对象的重要性。否则,识别应用程序中的泄漏点将是一项很多工作。我希望这个解释可以帮助那些不像我一样犯错的人。
答案 1 :(得分:1)
不确定它是否会改变任何东西,但是你没有尝试过控件中的静态构造函数,你尝试过类似的东西:
public MyDerivedTextBox()
{
this.DefaultStyleKey = typeof(MyDerivedTextBox);
}
这是我更熟悉的模式。也许MetaDataOverride正在做一些不可思议的事情。
顺便说一下,我注意到一些Silverlight内存问题,就是平板电脑输入服务带来了无法解释的AutomationPeers(见http://www.wintellect.com/CS/blogs/sloscialo/archive/2011/04/13/silverlight-memory-leaks-and-automationpeers.aspx)。