【发布时间】:2018-05-27 07:31:32
【问题描述】:
我有一个包含以下代码的 main 方法:
List<MyType> myList = openDialog();
对openDialog的调用打开一个对话框,返回一个带有所选项目的列表,该对话框用于选择项目。
private List<MyType> openDialog()
{
MyView myView = new MyView();
MyViewModel myViewModel = new MyViewModel();
myView.DataContext = myViewModel;
myView.ShowDialog();
return myViewModel.Result;
}
myViewModel.Result 是一个集合,其中包含视图中数据网格的 selectedItems。
我的问题是,我如何返回 ViewModel 的 Result 属性,我不确定 myViewModel 是否会被垃圾收集器重新收集,因为它仍然有对它的引用。
为了避免这种情况,我这样做:
private List<MyType> openDialog()
{
MyView myView = new MyView();
MyViewModel myViewModel = new MyViewModel();
myView.DataContext = myViewModel;
myView.ShowDialog();
return new List<MyType>(myViewModel.Result);
}
在返回时,我正在创建一个新列表以避免引用 Result 属性并确保重新收集 myViewModel 对象,但我想知道是否有办法避免创建新列表。
【问题讨论】:
-
你有理由相信它没有得到 GC-ed 吗?内存消耗是否一直在增加?
-
嗯,我的问题是我不知道如何测试对象是否被重新收集。我正在使用 VS 社区,如果它有调试和检查的选项,我不知道如何。或者,也许只有专业版和 avobe 版才有可能。谢谢。
-
我会从观察进程的内存性能计数器开始(这些计数器随您的 Windows 操作系统提供)。如果您的怀疑仍然存在,请切换到perfview
-
如果你能提供一个minimal reproducible example 那就太棒了(因为如果不知道
MyViewModel和Result到底是什么,就很难给出好的建议)。此外,levibotelho.com/development/how-does-the-garbage-collector-work 可能值得一读。 -
拿一个内存分析器看看,不要猜。