如何在Timer事件处理程序中获取Timer对象列表的列表索引

问题描述 投票:0回答:2

我的申请需要22个独立的计时器。所以我创建了一个这样的计时器列表。

List<Timer> myTimers = new List<Timer>();

for(int i = 0; i < 22; i++)
{
  myTimers.Add(new Timer());
}

然后我为计时器设置设置

foreach(var timer in myTimers)
{
  timer.Elapsed += new ElapsedEventHandler(ElapsedTimerEventHandler);
  timer.Interval = 10000;
  timer.Enabled = false;
}

然后我创建了一个启动计时器的方法。

public void SetTimerMethod(int timerId)
{
  var timer = myTimers.ElementAt(timerId);
  timer.Enabled = true;
}

我的问题是在我的事件处理程序中如何找出称为事件处理程序的计时器。我尝试使用indexOf(myTimers);在源对象上传递给事件处理程序,但这不起作用。我需要索引位置的原因是因为我需要根据哪个计时器到期更新类对象列表中的字段。任何帮助,将不胜感激。

我是新手,所以如果这是一种做我想做的坏方法,我愿意以不同的方式做到这一点。

c# timer timertask
2个回答
1
投票

如果你真的想要索引而不仅仅是计时器,你可以使用IndexOf

private ElapsedEventHandler(object sender, ElapsedEventArgs e)
{
    var index = myTimers.IndexOf((Timer)sender);
}

1
投票

如果每个计时器具有相同的间隔并且在同一时间启动,那么它们中的许多计时器与一个计时器有什么关系呢?无论如何,sender事件的Elapsed属性是源计时器(另见the docs

private void ElapsedTimerEventHandler(Object source, System.Timers.ElapsedEventArgs e)
{
   var timerCausingThisEvent = (Timer)source;  // source is the timer
   var timerInList = myTimers.First(t => t == timerCausingThisEvent);
   var index = myTimers.IndexOf(timerCausingThisEvent);
}
© www.soinside.com 2019 - 2024. All rights reserved.