Это проблема захвата? Я до сих пор не могу решить - PullRequest
1 голос
/ 08 апреля 2009

Я думал, что это проблема захвата, но ничего, что я делаю, не работает. попробуйте здесь упростить:

foreach (Question question in Test.Questions)
{
  int id= question.id;
  if(someIDictionary.TryGetValue(id, out value)
  { 
    question.answerobject.number=someinteger;
  }
  else
  {
    question.answerobject.number=someotherinteger;
  }
}

Я пытался создать временный объект для вопроса, но все еще не работал. все результаты всегда имеют значение последней итерации.

РЕДАКТИРОВАНИЕ: Каждый объект ответа создается в каждом объекте вопроса, поскольку вопрос создается с использованием linq to sql. тогда вопросы возвращаются как IList.

РЕДАКТИРОВАТЬ 2: проблема не возникает, если я присваиваю значения другому полю вопроса. проблема только с answerobject. значения answerobject одинаковы для всех вопросов (последнее задание).

Ответы [ 2 ]

2 голосов
/ 08 апреля 2009

Какую проблему вы видите? Проблема «захвата» влияет только на асинхронный / отложенный / многопоточный код - это не должно влиять на этот случай.

Интересно, наиболее вероятная проблема заключается в том, что все ваши Question объекты имеют один и тот же экземпляр answerobject или даже что у вас один и тот же экземпляр Question много раз.


иллюстрация «проблемы захвата» (см. Комментарии): эта проблема наблюдается при использовании лямбда / анон-метода; если переменная итерации (question выше) используется в лямбда / анон-методе, она «захватывается» - но слегка нелогичным образом ...

Например; мы можем ожидать, что это напечатает (в непредсказуемом порядке) числа 0-9:

int[] vals = {0,1,2,3,4,5,6,7,8,9};
foreach(int i in vals) {
    ThreadPool.QueueUserItem(delegate {
        Console.WriteLine(i);
    });
}
Console.ReadLine();

Но это не так ... мы исправляем это, добавляя дополнительную переменную:

int[] vals = {0,1,2,3,4,5,6,7,8,9};
foreach(int i in vals) {
    int tmp = i;
    ThreadPool.QueueUserItem(delegate {
        Console.WriteLine(tmp);
    });
}
Console.ReadLine();

Это потому, что поведение захваченных переменных определяется их лексической областью действия ... область действия переменной итерации немного больше, чем хотелось бы.

0 голосов
/ 08 апреля 2009

Проблема возникает, когда answerobject.number (int?) Присваивается значение «Ноль» при создании объекта. Если я пытаюсь присвоить значение во время цикла, я получаю проблему выше. Если же я назначу целое число при создании объекта, то проблема исчезнет, ​​и я смогу добавить новые значения во время цикла. Можете ли вы объяснить мне, потому что я не понимаю.

...