【发布时间】:2015-03-07 23:29:41
【问题描述】:
我在我的应用程序中使用 MVVM 灯。 我不知道如何释放 ObservableCollection 的内存 这是我的 ViewModel :
ObservableCollection<string> collTest = new ObservableCollection<string>();
public VMTest()
{
for (int x = 0; x < 100000; x++)
collTest.Add(String.Format("{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}", x, x, x, x, x, x, x, x, x, x));
}
public ICommand DeleteColl { get { return new RelayCommand(DeleteCollExecute, CanDeleteCollExecute); } }
bool CanDeleteCollExecute() { return true; }
void DeleteCollExecute()
{
collTest.Clear();
}
观点:
<Grid>
<StackPanel>
<Button Click="Button_Click"
Name="bt_test"
Content="New VMTest" />
<Button Content="delete ObservableCollection"
Command="{Binding DeleteColl}" />
</StackPanel>
</Grid>
后面的代码:
public TestMemoryLeak()
{
InitializeComponent();
this.DataContext = new VMTest();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
this.DataContext = new VMTest();
}
当我点击“bt_test”时,它会为我的视图创建一个新的 viewModel。我还有一个按钮可以清除 observableCollection。
如果我分配了一个新的 viewModel 或者我清除了 ObsevableCollection,内存永远不会被释放。 对于这个例子,每次点击 "bt_test" 需要 15Mo 多。在我的应用程序中,每次需要 50 兆,我在测试中达到 1.4Go 的消耗量......(我停止了测试)
你能帮帮我吗?
编辑:
经过调查,似乎是我的DAO有罪,是否有可能是我复制ObervableCollection时的问题?
LocColl = new ObservableCollection<Localite>(Factory.getILocalite().ListLocalite());
【问题讨论】:
-
你如何测量内存使用情况?
-
我使用了 VS2013 分析器和我的旧 TaskManager :-)
-
TaskManager 不是测量内存的好工具。让循环运行 10000 次,看看是否得到实际的 OOM 异常。
-
@Blam 是对的。分配内存的成本很高,因此 CLR 会保留它所需的尽可能多的内存,直到它不得不放手为止。除非您的应用程序按照他所说的那样得到 OOM,否则没有问题。
-
@eFloh 发布和实测不一样。任务管理器不是测量内存的好工具。如果它确实是内存泄漏,那么不,它不会被释放。
标签: c# wpf mvvm memory-leaks observablecollection