将不同的对象设置为Timer.Elapsed
本文关键字:Timer Elapsed 设置 对象 | 更新日期: 2023-09-27 18:30:10
我想为每个对象分配不同的计时器。
每个对象都包含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
试试这个:
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/closing-over-the-loop-variable-considered-harmful.aspx解释为什么在lambda中总是看到myEntity的最后一个值。
因为匿名/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();
}