System.Timers - 如何将变量传递给ElapsedEvent,该变量通过每个“foreach”迭代进行更改

时间:2013-09-27 13:41:13

标签: c# api timer event-handling

我会尽量保持这个简单。这是我的方法,只是为了开始 - 我理解下面的代码是不正确的 - 这就是我现在所拥有的:

public static void GetActorsFromCastList(TmdbMovieCast cast)
{
    // use timers here
    List<Cast> liCast = cast.cast;

    Timer actorTimer = new Timer(1000);

    // put the below into a foreach loop to get a new personId each time???

    foreach (var i in liCast)
    {
        actorTimer.Elapsed += new ElapsedEventHandler((sender, e) => RunActorEvent(sender, e, i.id));
        actorTimer.Start();
    }
}

public static void RunActorEvent(object sender, ElapsedEventArgs e, int personId)
{
    // run a single API call here to get a Person (actor)
    _actors.Add(_api.GetPersonInfo(personId));
}

正如您所看到的,我创建了System.Timer,如上所述,我们的想法是每秒调用RunActorEvent并每次传入不同的PersonId。最终目标是每秒调用RunActorEvent一次,但每次都传入一个新的PersonId。我已经创建了ElapsedEventHandler,因此我添加了第三个参数PersonId

那就是我所在的地方。我遇到的困境是这看起来不正确。我的意思是,我有一个foreach循环,基本上每次迭代都会创建一个新的ElapsedEventHander,我不认为这应该是设计。

问题:如何创建System.Timer和相应的ElapsedEventHandler,但传入变量(PersonId)每次调用RunActorEvent时,进入ElapsedEventHander(事件处理程序)?

2 个答案:

答案 0 :(得分:1)

您可以将List<Cast>传递给您的事件,在列表上有一个类级别索引,并在每次事件中增加该索引:

actorTimer.Elapsed += new ElapsedEventHandler((sender, e) => RunActorEvent(sender, e, liCast));

然后在方法中:

int index = 0; //class level index
public static void RunActorEvent(object sender, ElapsedEventArgs e, List<Cast> list)
{
    int personId = list.ElementAt(index++); //or list[index++]
    _actors.Add(_api.GetPersonInfo(personId));
}

答案 1 :(得分:1)

另一种写作方式,在我看来,它有点清洁......

actorTimer.Elapsed += (sender, e) => RunActorEvent(sender, e, personId);

与您的问题无关,但此行有害:

List<Cast> liCast = cast.cast;

cast.cast根本没有意义。