C#判断几个定时器中哪个超时了

C# Determine which of several timers has expired

我有一个对象数组,每个对象都有自己的计时器。如果在构建数组对象时我传递了自己的定时器事件处理程序以供定时器使用,是否有任何方法可以判断哪个对象的定时器已过期。

如果不是,我数组中的所有对象似乎都需要捕捉它们自己的计时器,我需要实现一个完全不同的委托,它采用类似 InnerObject 的东西作为参数,这样内部对象自己的事件处理程序就可以像这样称呼它:OuterDelegate(this,eventArgs);

同一条线上的所有各种方法都是如此荒谬的麻烦,我不禁认为必须有更好的方法。在其他系统上,计时器总是采用包含在事件处理程序参数中的令牌,但我找不到与 .net(核心)中类似的东西。

事实证明 System.Timers 完全是垃圾,但不是您唯一的选择。 System.Threading.Timer 正是我要找的功能。我只是没有意识到有两个版本,直到我偶然发现某些抱怨让我意识到它们不一样的事实,我终于看到了线程版本。

编辑:

System.Threading.Timer 的回调看起来像这样

public delegate void TimerCallback(object state);

其中 state 是构造期间传递给计时器的任意对象。它可以封装事件处理程序正确处理事件的特定实例所需的任何内容。您甚至可以在事件处理期间在对象上设置属性或调用方法,从而根据计时器控制其状态。

编辑-2

System.Timers 实现中唯一隐约相似的是附加 System.ComponentModel.ComponentCollection 的能力以及指向集合中组件的能力。这些是属于 System. Windows. Forms. Control 的 COM 对象。即使您扩展 class 来满足您自己的需要,您也会拖着对不可用属性的支持。

您可以同样轻松地扩展 System.Threading.Timer,而无需拖着不必要的包袱。

你的问题的答案很简单。 System.Timers.Timer Elapsed 事件的 event handler 使用名为 sender 的参数发布。

  _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
    }

sender实际上是System.Timers.Timerclass的实例。 所以,有了这个你可以知道已经过去的计时器......

此外,这个 class 可以是 extended/Inherited,这意味着您可以创建自己的自定义计时器 class 并有一个额外的 属性 名称,它您可以使用它来比较并了解哪个计时器已用完。 示例:

        class CustomTimer : System.Timers.Timer {
           public string TimerName { get; set; }
           //More properties as you need
            }
            //common handler for array of timers
            private void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) {
                var elapsedTimer = sender as CustomTimer;
                if (elapsedTimer.TimerName.Equals(/*which ever*/)) {
                    //continue with logic
                }
                // continue with logic
            }