如何正确覆盖 System.Timers.Timer Elapsed Event

Posted

技术标签:

【中文标题】如何正确覆盖 System.Timers.Timer Elapsed Event【英文标题】:How to correctly override System.Timers.Timer Elapsed Event 【发布时间】:2020-04-27 11:31:50 【问题描述】:

我想覆盖 System.Timers.Timer 类的默认 Elapsed 事件,以便能够在需要时轻松删除所有事件侦听器。使用来自this 问题的豪尔赫的回答,我想出了以下内容

       class CustomTimer : System.Timers.Timer 

            List<ElapsedEventHandler> delegates = new List<ElapsedEventHandler>();

            private new event ElapsedEventHandler _elapsed;

            public new event ElapsedEventHandler Elapsed 
                add 
                    _elapsed += value;
                    delegates.Add(value);
                
                remove 
                    _elapsed -= value;
                    delegates.Remove(value);
                
            

            public void RemoveAllEvents() 
                foreach (ElapsedEventHandler e in delegates) 
                    _elapsed -= e;
                
                delegates.Clear();
            
        

当我运行正在执行此操作的服务时,我可以跟踪查看是否分配了私有 Elapsed 成员。但是我无法看到事件处理程序实际执行。我设置正确了吗?

【问题讨论】:

【参考方案1】:

我就是这样做的:

public void AddElapsed(ElapsedEventHandler newHandler)

    base.Elapsed += newHandler;
    delegates.Add(newHandler);

那就只用AddElapsed()而不是Elapsed +=

也可以添加以下内容:

[Obsolete]
public new event ElapsedEventHandler Elapsed;

【讨论】:

您还需要定义公共事件和私人支持吗? @pingOfDoom 我不碰事件,只是继承自计时器并添加了一个新方法。 你不必在派生类中重新定义事件? 不,你不必这样做。如果你愿意,我可以猜测并警告应该使用新方法。或者,可以在经过的事件中添加 [Obsolete] 属性

以上是关于如何正确覆盖 System.Timers.Timer Elapsed Event的主要内容,如果未能解决你的问题,请参考以下文章

Facebook SDK - 如何正确覆盖 onActivityResult()?

如何在 Python 中正确覆盖和调用超方法

如何在 Chrome 中覆盖用户代理样式表并正确显示我的设计

如何在 Java 中正确覆盖 toString()?

如何在情节提要中正确创建覆盖视图?

如何正确覆盖 `Illuminate\Routing\Router::toResponse` 以便为空响应发送 HTTP 状态代码 204?