Предупреждение: это мое первое «настоящее» приложение WPF. Я уверен, что это логическая ошибка, которая у меня где-то есть, но я не могу понять, где я должен искать.
У меня есть приложение типа киоска, которое циклически перебирает различные окна, каждое из которых отображает разные типы данных. Я (в настоящее время) управляю ими через таймер, и приложение работает хорошо, пока, наконец, не достигну исключения «Недостаточно памяти».
Мой код для поворота через окна выглядит следующим образом:
private Window activeWindow;
private void ShowNextTaskWindow(ITask task) {
Window nextWindow = windowManager.GetWindowForTask(task);
nextWindow.Show();
if (activeWindow != null) {
activeWindow.Close();
}
activeWindow = nextWindow;
}
Класс windowManager просто создает экземпляр соответствующего типа окна, то есть NewsWindow или VideoWindow, в зависимости от типа задачи:
public Window GetWindowForTask(ITask task) {
Window taskWindow = null;
switch (task.TaskType) {
case TaskType.Web:
taskWindow = new WebWindow(task as WebTask);
break;
case TaskType.Rss:
taskWindow = new RssWindow(task as RssTask);
break;
..... etc ......
}
return taskWindow;
}
Каждое окно имеет (только) один обработчик событий, добавленный в конструктор, например:
Loaded += new RoutedEventHandler(Window_Loaded);
и, конечно, есть соответствующий метод Window_Loaded, который выполняет некоторую работу с макетом (настройка размеров окон, размеров элементов управления и т. Д.).
Проблема, с которой я столкнулся, заключается в том, что приложение просто продолжает потреблять память до тех пор, пока оно, наконец, не завершится с исключением «Недостаточно памяти» - и я не могу понять, где что-то упущено.
Насколько я понимаю, вызов Window.Close () должен избавиться от окна, поэтому я теряюсь в том, где искать проблему.
Есть идеи?