警告:這是我第一個'真正'的WPF應用程序。我確定這是一個邏輯錯誤,我有一個地方,但無法弄清楚我應該在哪裏尋找。WPF Window.Close內存泄漏
我有一個自助服務終端類型的應用程序,循環通過各種窗口,每個窗口顯示不同類型的數據。我(目前)通過一個定時器來控制它們,並且應用程序運行良好,直到我最終達到內存不足異常。
我的代碼通過Windows轉動如下:
private Window activeWindow;
private void ShowNextTaskWindow(ITask task) {
Window nextWindow = windowManager.GetWindowForTask(task);
nextWindow.Show();
if (activeWindow != null) {
activeWindow.Close();
}
activeWindow = nextWindow;
}
的窗口管理類只實例化窗口的適當類型 - 即NewsWindow或視頻窗口,根據任務類型:
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()應該擺脫窗口,所以我迷失在哪裏尋找問題。
任何想法?
你確定不是泄漏內存的窗口中的控件之一嗎?如果您使用空窗口運行應用程序,是否會發生內存不足異常? – 2011-04-25 19:35:23
你的窗口是否擁有非託管資源?考慮使用MVVM設計模式 - 您當前的體系結構不是非常WPF風格的。 – 2011-04-25 20:17:46
非常像這個http://stackoverflow.com/questions/2860965/wpf-memory-leak的答案,我發現一個案例,我確實有一個事件處理程序,用戶沒有正確處理。我已經修復了 - 但總體而言,仍然遭受同樣的問題。如果我想知道*我正在「做錯了」,那就去看MVVM吧。謝謝,@Danny Varod – reallyJim 2011-04-26 21:59:28