如何在.NET中对通用列表进行排序时修复内存泄漏?
private void ManageXmlIndex(XmlDocument xmlDocIndicatorIndex)
{
indexList = repoManager.ParseIndex(xmlDocIndicatorIndex);
indexList.Sort((x, y) => y.Created.CompareTo(x.Created));
view.UpdateIndex(indexList);
}
当我使用linq OrderBy
时会发生同样的情况。
自定义比较功能可以解决问题吗?
由于List.Sort
错误发生。当我注释掉Sort
行时,错误消失了。
答案 0 :(得分:2)
您所看到的不是内存泄漏。它只是编译器在调用站点将Comparison<IndicatorPropReport>
缓存为static
委托的方式,因此无需为每次调用创建它的实例。
如果你看一下这个简化的例子:
var ints = new List<int> { 3, 2, 1, 8, 5 };
ints.Sort((x, y) => x.CompareTo(y));
看看编译器使用.NET反编译器生成的内容:
[CompilerGenerated]
private static Comparison<int> CS$<>9__CachedAnonymousMethodDelegate2;
public static void Main(string[] args)
{
List<int> ints = new List<int> { 3,2,1,8,5 };
List<int> arg_51_0 = ints;
if (Program.CS$<>9__CachedAnonymousMethodDelegate2 == null)
{
Program.CS$<>9__CachedAnonymousMethodDelegate2 =
new Comparison<int>(Program.<Main>b__1);
}
arg_51_0.Sort(Program.CS$<>9__CachedAnonymousMethodDelegate2);
}
[CompilerGenerated]
private static int <Main>b__1(int x, int y)
{
return x.CompareTo(y);
}
您看到Comparsion<int>
已缓存为static
代理人。在方法调用中会发生相同的行为。
注意此行为是Roslyn之前的行为。 Roslyn changes the way delegates are cached通过创建显示类而不是静态委托,即使没有捕获的变量。
答案 1 :(得分:1)
我从Microsoft支持中找到了答案:
List<T>
在其静态构造函数中创建一个空数组T
。该 数组存储在List<T>
的静态字段中,因此它将一直存在直到 AppDomain死了。所以,不是内存泄漏。
我希望能够支持你的问题。