将不同的对象设置为Timer.Elapsed

oha*_*nho 1 .net c#

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

每个对象都包含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();
}
Run Code Online (Sandbox Code Playgroud)

问题是'EntityTimeElapsed'被最后一个"MyEntity"对象击中,而不是我想要的那个.

我该如何解决?

更新:

我目前正在使用.Net 4.0

Ale*_*ria 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();
Run Code Online (Sandbox Code Playgroud)

}

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

  • 该链接解释了它.你的lambda _captures_引用(`myEntity`)随后改变.这是你的问题.现在,解决方案是捕获未重新分配的变量. (2认同)