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/closing-over-the-loop-variable-considered-harmful.aspxで、ラムダに常に最後の値が表示される理由を説明しますmyEntityの。

于 2013-09-03T11:52:23.010 に答える