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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Timer事件处理程序中获取Timer对象列表的列表索引相关的知识,希望对你有一定的参考价值。

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

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

答案

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

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

如果每个计时器具有相同的间隔并且在同一时间启动,那么它们中的许多计时器与一个计时器有什么关系呢?无论如何,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);
}

以上是关于如何在Timer事件处理程序中获取Timer对象列表的列表索引的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 服务的 timer_elapsed 事件处理程序中使用异步等待

System.Timers.Timer

应用层timer_如何序列化timer

如何防止 System.Timers.Timer 在线程池上排队执行?

使用 StructureMap 在 Timer_Elapsed 中处理 Datacontext 操作

winform如何用Timer实现将时间动态显示在窗体上?