Я создал приложение, использующее фреймворк AvalonDock. Ключевой частью является возможность редактировать объекты модели предметной области с помощью редакторов, производных от AvalonDock.DocumentContent
. Я столкнулся с проблемой и обнаружил, что мои редакторы не собирают мусор после того, как они закрываются и удаляются из коллекции DockingManager.Documents
.
После бесплодных поисков я создал небольшое тестовое приложение, которое можно воссоздан следующим образом:
AvalonDockLeak
; Document
; Измените Document.xmal на:
<Сетка>
ad: DocumentContent>
Измените Document.xmal.cs на:
пространство имен AvalonDockLeak
{
используя AvalonDock;
общедоступный частичный класс Document: DocumentContent
{
публичный документ ()
{
InitializeComponent ();
}
~ Документ ()
{
}
}
}
Деструктор, который я добавил, чтобы иметь возможность диагностировать проблему, добавляя точку останова в методах, открывающих {, и проверяя, сработает ли она. Это всегда происходит при закрытии тестового приложения, но не раньше.
Теперь измените Window1.xaml на:
<Сетка>
ad: DockingManager>
Измените Window1.xaml.cs на:
пространство имен AvalonDockLeak
{
используя System.Windows;
общедоступный частичный класс Window1: Window
{
частный счетчик int = 0;
общедоступное Window1 ()
{
InitializeComponent ();
}
private void NewButton_Click (отправитель объекта, RoutedEventArgs e)
{
строка name = "Document" + (++ this.counter) .ToString ();
var document = новый документ ()
{
Имя = имя,
Заголовок = имя,
IsFloatingAllowed = false
};document.Show (this.DockManager);
document.Activate ();
}
}
}
Это простое приложение также содержит утечку. Это можно увидеть по точке останова на открытии ~ Document ()
{не происходит попадания после закрытия DocumentContent
.
Теперь я хочу узнать, известно ли это проблема и есть ли способ ее предотвратить? Если объекты собираются мусором только спустя долгое время, что я могу сделать, чтобы ускорить это? Кстати, вызов GC.Collect () не помогает.