Deserializing
只有一条记录的文件后
似乎它处于一个不定式的循环中
IndexSeries = (List<string>)bFormatter.Deserialize(fsSeriesIndexGet);
IndexSeries.ForEach(name => AddSerie(name));
//IndexSeries.ForEach(delegate(String name)
//{
// AddSerie(name);
//});
AddSerie
将被无限期执行!
答案 0 :(得分:4)
您使用含糊不清的字词。首先你提到一个无限循环,然后提到AddSerie
将被执行'无限'[原文如此];基于此,我认为你提出的问题并不是ForEach
永远持续下去(如暗示/陈述),而是AddSerie
做了一件似乎是永远地拿走。
这甚至可能相当于Joey提到的内容:如果您在ForEach
调用的上下文中将某个元素添加到列表,那么您总是一步到位落后于完成,因此不会“完成”。但是,获得OutOfMemoryException
实际上会相对较快地发生,如果,比如说,AddSerie
除此之外什么都不做 - 可能需要更长时间才能达到 / em> AddSerie
是一种相对耗时的方法。再说一次,你可能永远不会得到这样的例外(在讨论的上下文中)如果 AddSerie
只需要一个狗年龄来完成而没有贡献长度的列表。
显示您的AddSerie
代码可能对确定实际问题最有帮助。
答案 1 :(得分:2)
如果我定义:
//class level declaration (in a console app)
static List<string> strings;
static void Loop(string s)
{
Console.WriteLine(s);
strings.Add(s + "!");
}
然后
static void Main(string[] args)
{
strings = new List<string> { "sample" };
strings.ForEach(s => Console.WriteLine(s));
}
正常执行,输出单个字符串,而
static void Main(string[] args)
{
strings = new List<string> { "sample" };
strings.ForEach(s => Loop(s));
}
无限循环,在过程中添加'!'和
static void Main(string[] args)
{
strings = new List<string> { "sample" };
foreach (string s in strings)
{
Loop(s);
}
}
抛出InvalidOperationException( Collection被修改;枚举操作可能无法执行),在我看来这是正确的行为。为什么List.ForEach
方法允许通过操作更改列表,我不知道,但是想知道:)