Wie*_*tze 8 c# wpf garbage-collection avalondock
我创建了一个使用AvalonDock框架的应用程序.关键部分是使用AvalonDock.DocumentContent派生编辑器编辑域模型实体的能力.我遇到了一个问题,发现我的编辑在关闭并从DockingManager.Documents集合中删除后没有被垃圾收集.
经过一些徒劳无功的搜索后,我创建了一个小型测试应用程序,可以通过以下方式重新创建:
AvalonDockLeak;Document;将Document.xmal更改为:
<ad:DocumentContent x:Class="AvalonDockLeak.Document"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock">
<Grid>
<TextBox />
</Grid>
</ad:DocumentContent>
Run Code Online (Sandbox Code Playgroud)将Document.xmal.cs更改为:
namespace AvalonDockLeak
{
using AvalonDock;
public partial class Document : DocumentContent
{
public Document()
{
InitializeComponent();
}
~Document()
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
我添加的析构函数能够诊断问题,在方法打开时添加一个断点{,并查看它是否被击中.它总是关闭测试应用程序,但不是更早.
现在将Window1.xaml更改为:
<Window x:Class="AvalonDockLeak.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ad="clr-namespace:AvalonDock;assembly=AvalonDock"
Title="Memory Leak Test" Height="300" Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
</Grid.RowDefinitions>
<Button Name="NewButton" Click="NewButton_Click" Content="New" Height="26" Width="72" />
<ad:DockingManager x:Name="DockManager" Grid.Row="1">
<ad:DocumentPane />
</ad:DockingManager>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)将Window1.xaml.cs更改为:
namespace AvalonDockLeak
{
using System.Windows;
public partial class Window1 : Window
{
private int counter = 0;
public Window1()
{
InitializeComponent();
}
private void NewButton_Click(object sender, RoutedEventArgs e)
{
string name = "Document" + (++this.counter).ToString();
var document = new Document()
{
Name = name,
Title = name,
IsFloatingAllowed = false
};
document.Show(this.DockManager);
document.Activate();
}
}
}
Run Code Online (Sandbox Code Playgroud)这个简单的应用程序也包含泄漏.这可以通过~Document()开口处的断点观察到{关闭后没有被击中DocumentContent.
现在我想要的是,这是一个已知的问题,有没有办法防止它?如果对象在很长一段时间后才被垃圾收集,那么我该怎样做才能加速呢?调用GC.Collect()并没有帮助.
显然,您的 DocumentContent 的引用由事件处理程序保存在某处。您应该使用内存分析器(例如Microsoft 的CLR-Profiler)来确定原因。
您应该注意始终取消注册已注册的事件。否则可能会出现内存泄漏。为此,您可以使用 -= 运算符。
我强烈建议您和任何使用 AvalonDock 1.3 的人升级到版本 2.0。最新版本是 MVVM 友好的,并且不会遇到此问题(文档和锚定对象已正确垃圾收集)。更多信息:avalondock.codeplex.com
谢谢
| 归档时间: |
|
| 查看次数: |
3248 次 |
| 最近记录: |