System.Timers - 如何将变量传递到通过每个“foreach”迭代而变化的 ElapsedEvent 中
本文关键字:foreach 迭代 ElapsedEvent 变化 Timers 变量 System | 更新日期: 2023-09-27 18:33:06
我会尽量保持简单。 这是我的方法,只是为了开始 - 我知道下面的代码不正确 - 这就是我目前所拥有的:
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
,但在每次调用ElapsedEventHander
时将新变量(PersonId
)传递到RunActorEvent
(事件处理程序)中?
您可以将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));
}
只是另一种写法,在我看来,它更干净一些......
actorTimer.Elapsed += (sender, e) => RunActorEvent(sender, e, personId);
与您的问题无关,但这行很痛:
List<Cast> liCast = cast.cast;
cast.cast
根本没有意义。