C#确定几个计时器中的哪一个已过期



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

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

同一条线上的各种方式都是如此荒谬的麻烦,我忍不住想一定有更好的方法。在其他系统上,计时器总是将参数中包含的令牌带到事件处理程序,但我在.net(core(中找不到类似的东西。

问题的答案相当简单。System.Timers.TimerElapsed事件的event handler是使用名为sender的参数发布的。

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

sender实际上是经过的System.Timers.Timer类的一个实例。所以,有了这个,你就可以知道经过的计时器。。。

此外,这个类可以被扩展/继承,这意味着你可以创建自己的自定义Timer类,它有一个名为Name的额外属性,你可以用它来比较和知道哪个计时器已经过去了。示例:

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
} 

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

编辑:

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

public delegate void TimerCallback(object state);

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

第2版

System.Timers实现中唯一有点类似的是附加System.ComponentModel.ComponentCollection的能力,以及指向集合中某个Component的能力。这些是属于系统的COM对象。​Windows。​表格。​控制即使您扩展类以满足自己的需求,也会将对不可用属性的支持拖到身边。

您可以同样轻松地扩展System.Threading.Timer,而不必拖着不必要的行李。

最新更新