1

我认为这是一个捕获问题,但我没有做任何工作。尝试在这里简化:

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 的值都是相同的。

4

2 回答 2

2

你看到的问题是什么?“捕获”问题只影响异步/延迟/线程代码 - 它不应该影响这种情况。

我想知道这里最可能的问题是否是您的所有Question对象都具有相同的answerobject实例 - 或者甚至您多次拥有相同的Question实例。


“捕获问题”的插图(见评论):这是使用 lambda/anon 方法时看到的问题;如果在 lambda/anon 方法中使用了迭代变量(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();

这是因为捕获变量的行为是由它们的词法范围决定的……迭代变量的范围比我们想要的大一点。

于 2009-04-08T04:58:01.283 回答
0

在创建对象时将 answerobject.number (int?) 分配为“Null”时,似乎会出现此问题。如果我尝试在循环期间分配一个值,我会遇到上述问题。但是,如果我在创建对象时分配了一个整数,问题就消失了,然后我可以在循环期间添加新值。你能解释一下,因为我不明白。

于 2009-04-08T17:21:59.873 回答