在我的WPF
应用程序中,我的代码中有以下使用DataGrid
的方法:
List<IColumn> GetColumns()
{
return _columnItems
.Where(column => column is TextColumn<T> textColumn &&
textColumn.IsColumnEnabled
)
.ToList();
}
即使在关闭包含相应datagrid
的对话框后,此代码仍保留在内存中.我可以通过判断dotMemory
和JetBrains
来看到它,我有一个Func<IColumn, bool>
作为GC根,保持我的DataGrid.
然而,如果我只执行这个简单的更改:
List<IColumn> GetColumns()
{
var columnsToReturn = new List<IColumn>();
foreach (var column in _columnItems)
{
if (column is TextColumn<T> textColumn && textColumn.IsColumnEnabled)
columnsToReturn.Add(textColumn);
}
return columnsToReturn ;
}
内存泄漏消失了,DataGrid
的实例在关闭对话框后被清除,这个曾经是GC根的Func
也消失了.
虽然我很高兴我已经解决了内存泄漏问题,I would like to understand what's going on?
我假设它与Linq
投影有关,这是缓存条目的逻辑,尽管我有点惊讶,因为泄漏的代码最后有ToList()
,这本来应该执行查询的.我的长语法避开了Linq
Func(WHERE),因此"切断"了dotMemory
中的 twig .
我的意思是,我已经从这个方法返回了Func
次执行,因为我已经调用了ToList()
,所以无论使用什么方法的输出都使用返回的列表,那么为什么Linq
或IEnumerable
还会把Func
保存在内存中呢?