我会尽量保持这个简单。这是我的方法,只是为了开始 - 我理解下面的代码是不正确的 - 这就是我现在所拥有的:
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
(事件处理程序)?
答案 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
根本没有意义。