如何正确覆盖 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()?
如何在 Chrome 中覆盖用户代理样式表并正确显示我的设计
如何正确覆盖 `Illuminate\Routing\Router::toResponse` 以便为空响应发送 HTTP 状态代码 204?