Цикл ForEach для универсального списка повторяется бесконечно - PullRequest
2 голосов
/ 16 февраля 2012

После Deserializing файла только с одной записью

Кажется, что он находится в бесконечном цикле

IndexSeries = (List<string>)bFormatter.Deserialize(fsSeriesIndexGet);
IndexSeries.ForEach(name => AddSerie(name));
//IndexSeries.ForEach(delegate(String name)
//{
      //    AddSerie(name);
//});

AddSerie будет выполняться бесконечно!

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Вы используете двусмысленные термины.Сначала вы упоминаете бесконечный цикл, а затем упоминаете, что AddSerie будет выполняться «бесконечно» [sic];Исходя из этого, я думаю, что проблема, о которой вы говорите, не в том, что ForEach продолжается и продолжается вечно (как подразумевается / заявлено), а в том, что AddSerie делает что-то, что, кажется, принимает навсегда.

Это может даже равняться тому, что упомянул Джои: если вы добавляете элемент в список , а в контексте вызова ForEach, то вы всегда на один шаг позадив завершении, и, следовательно, не будет «завершено».Однако получение OutOfMemoryException на самом деле происходит относительно быстро , если , скажем, AddSerie ничего не делает, кроме этого - может потребоваться больше времени, чтобы добраться до такой точки , если AddSerieявляется относительно трудоемким методом.Опять же, вы можете никогда не получить такое исключение (в обсуждаемом контексте) , если AddSerie просто берет возраст собаки, чтобы завершить без , способствующим увеличению длины списка.

Отображение кода AddSerie может оказаться наиболее полезным при определении фактической проблемы .

2 голосов
/ 16 февраля 2012

Если я определю:

//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 (коллекция была изменена; операция перечисления может не выполняться ), что, на мой взгляд, является правильным поведением.Почему метод List.ForEach позволяет изменять список с помощью действия, я не знаю, но хотел бы выяснить:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...