AvalonDockフレームワークを利用するアプリケーションを作成しました。AvalonDock.DocumentContent
重要な部分は、派生エディターを使用してドメインモデルエンティティを編集する機能です。問題が発生し、エディターを閉じてコレクションから削除した後、エディターがガベージコレクションされていないことがわかりましたDockingManager.Documents
。
無駄な検索を行った後、次の方法で再作成できる小さなテストアプリケーションを作成しました。
- Visual Studio(私は2008を使用しています)で、
AvalonDockLeak
;という名前の新しいWPFアプリケーションを作成します。 - AvalonDockライブラリへの参照を追加します(私のバージョンは1.3.3571.0です)。
Document
;という名前の新しいUserControlを追加します。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>
Document.xmal.csを次のように変更します。
namespace AvalonDockLeak { using AvalonDock; public partial class Document : DocumentContent { public Document() { InitializeComponent(); } ~Document() { } } }
{を開くメソッドにブレークポイントを追加して問題を診断し、ヒットするかどうかを確認できるようにするために追加したデストラクタ。テストアプリケーションを閉じるときに常に実行されますが、それ以前には実行されません。
次に、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>
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(); } } }
この単純なアプリケーションには、リークも含まれています。これは、開始時のブレークポイント~Document()
{を閉じた後にヒットしないことで確認できますDocumentContent
。
今私がしたいのは、これは既知の問題であり、それを防ぐ方法はありますか?オブジェクトが久しぶりにガベージコレクションされた場合、これを促進するために何ができますか?ちなみに、GC.Collect()を呼び出しても役に立ちません。