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

时间:2018-05-18 20:15:16

标签: c# timer timertask

我的申请需要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);在源对象上传递给事件处理程序,但这不起作用。我需要索引位置的原因是因为我需要根据哪个计时器到期更新类对象列表中的字段。任何帮助将不胜感激。

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

2 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:1)

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

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