【问题标题】:How to correctly override System.Timers.Timer Elapsed Event如何正确覆盖 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 成员。但是我无法看到事件处理程序实际执行。我设置正确了吗?

【问题讨论】:

    标签: c# events system.timers.timer


    【解决方案1】:

    我就是这样做的:

    public void AddElapsed(ElapsedEventHandler newHandler)
    {
        base.Elapsed += newHandler;
        delegates.Add(newHandler);
    }
    

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

    也可以添加以下内容:

    [Obsolete]
    public new event ElapsedEventHandler Elapsed;
    

    【讨论】:

    • 您还需要定义公共事件和私人支持吗?
    • @pingOfDoom 我不碰事件,只是继承自计时器并添加了一个新方法。
    • 你不必在派生类中重新定义事件?
    • 不,你不必这样做。如果你愿意,我可以猜测并警告应该使用新方法。或者,可以在经过的事件中添加 [Obsolete] 属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 2015-11-02
    • 1970-01-01
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多