1

我想为每个对象分配不同的计时器。

每个对象都包含 Timer 作为类成员。

这就是我尝试过的:

private void EntityTimeElapsed(object sender, MyEntity myEntity)
{

}

foreach (MyEntity myEntity in entities)
{
  myEntity.timer.AutoReset = true;
  myEntity.timer.Elapsed += (sender, arguments) => this.EntityTimeElapsed(sender, myEntity);
  myEntity.timer.Start();
}

问题是“EntityTimeElapsed”被最后一个“MyEntity”对象击中,而不是我想要的那个。

我该如何解决?

更新:

我目前正在使用 .Net 4.0

4

2 回答 2

5

试试这个:

foreach (MyEntity myEntity in entities)
{
    var myEntity2 = myEntity ;

    myEntity2.timer.AutoReset = true;
    myEntity2.timer.Elapsed += (sender, arguments) => this.EntityTimeElapsed(sender, myEntity2);
    myEntity2.timer.Start();

}

那里http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closure-over-the-loop-variable-considered-harmful.aspx解释了为什么你总是在你的 lambda 中看到最后一个值我的实体。

于 2013-09-03T11:52:23.010 回答
0

因为匿名/lambda 方法使用了来自枚举器的变量实体,它发生了变化。您必须首先创建一个本地成员/变量并在您的 lambda 方法中使用该成员/变量。

foreach (MyEntity myEntity in entities)
{
  MyEntity backup = myEntity;
  myEntity.timer.AutoReset = true;
  myEntity.timer.Elapsed += (sender, arguments) => this.EntityTimeElapsed(sender, backup);
  myEntity.timer.Start();
}
于 2013-09-03T12:04:36.983 回答