0

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

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)传递给(事件处理程序)?RunActorEventElapsedEventHander

4

2 回答 2

1

只是另一种写它的方式,在我看来,它有点干净......

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

与您的问题无关,但这条线很痛:

List<Cast> liCast = cast.cast;

cast.cast根本没有意义。

于 2013-09-27T13:49:23.293 回答
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));
}
于 2013-09-27T13:47:09.457 回答