【发布时间】:2019-04-10 13:19:56
【问题描述】:
我将在这个问题中使用伪代码,所以请在理论上参考这个(我的意思是,会有一些简化)
假设这种情况:
我的应用程序有 MainWindow,其中有 TabControl。为了从其集合中删除项目,我使用 MainWindow 的 static 函数如下:
public static void CloseTab(string someKindOfTabIdentity)
{
var tab = myTabControl.Items.FirstOfDefault(someScenario);
if (tab != null)
{
myTabControl.Items.Remove(tab);
tab.Content = null;
tab = null;
GC.Collect();
}
}
现在,我有 Page1,我允许用户通过某些功能关闭标签页
private void GoToPage2()
{
MainWindow.CreatePage2AddToTabControlAndNavigateToIt()
MainWindow.CloseTab(myCurrentPage1Tab);
App.Cursor = Cursors.Arrow;
}
这个函数应该创建一个新的Tab,给它分配内容,然后使用MainWindow.CloseTab(myCurrentPage1Tab);,关闭当前的Tab,它包含Page1。
这里有问题:
MainWindow.CloseTab(myCurrentPage1Tab);行之后 Page1 的内存分配会发生什么情况?如果
MainWindow.CloseTab(myCurrentPage1Tab);行后面有代码,Page1 的内存分配会怎样?Page1 何时会从内存中完全释放?
有没有更好(更有效)的方法来实现这一点?
这个简化的场景是我的 WPF 应用程序一直在发生的事情,我担心这是否是一种安全的方式来管理我的应用程序的选项卡项和内存。
【问题讨论】:
-
从标签控件中删除标签并不意味着您的标签未被引用,如果它是一次性的,您也应该处置标签。
-
请注意,在调用
myTabControl.Items.Remove(tab)之前设置tab = null没有多大意义,即使在伪代码中也是如此。 -
@Clemens 当然不是,我会编辑它,谢谢。
-
@LaurentLequenne 你能扩展你的答案吗?
-
我建议正确处理选项卡,而不是将其设置为空。将其设置为 null 将起作用,但是,垃圾收集器启动并完全处理它需要一段时间
标签: c# wpf memory-management