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(事件处理程序)中?

System.Timers - 如何将变量传递到通过每个“foreach”迭代而变化的 ElapsedEvent 中

您可以将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根本没有意义。