我在Silverlight应用程序中有内存泄漏,我使用此信息开始,
哪个很棒。我已经提取了一些代码来解决这个问题。所以代码看起来像这样一个子窗口,
<controls:ChildWindow x:Class="MemoryLeakTesting2.ConfirmDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"
xmlns:telerik="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls"
Width="375" >
<Grid Margin="2">
<telerik:RadButton Content="OK" Click="OnClick" Command="{Binding CancelActionCommand}" Width="75" Height="23" HorizontalAlignment="Right" Margin="0,12,0,0" Grid.Row="1" />
</Grid>
</controls:ChildWindow>
背后的代码就是这个,
public partial class ConfirmDialog : ChildWindow
{
public ConfirmDialog()
{
InitializeComponent();
}
[SuppressMessage("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
private void OnClick(object sender, RoutedEventArgs e)
{
DialogResult = true;
}
}
我从我的主要silverlight页面中的按钮点击事件中调用此代码,如下所示
private void Button_Click(object sender, RoutedEventArgs e)
{
ConfirmDialog dialog = new ConfirmDialog();
dialog.Show();
}
每次打开弹出窗口并关闭它时,都会泄漏内存。我使用WinDbg,它实际上表明每次弹出和关闭后都不释放ConfirmDialog实例??
答案 0 :(得分:1)
Button.Command
因泄漏而臭名昭着。我的猜测是值CancelActionCommand
具有对长寿命对象的引用。 Button
不会取消ICommand.CanExecuteChanged
事件。您应该考虑使用Weak Event Pattern来限制可漏表面积。
Here is a better explanation and example code to fix the problem.
答案 1 :(得分:1)
可能是:
在每次点击活动中,您正在创建ConfirmDialog
对象,该对象在不再使用后可能会挂起。您是否可以将其创建为类变量并且只有一个引用,并在需要显示ChildWindow