在我的应用程序中,我有dispatcherTimer和几个eventHandlers,我在dispatcherTimer.Tick事件中使用:
dt.Tick += myEventHandler1
当我想切换tick的事件处理程序时,我会使用这样的:
dt.Tick -= myEventHandler1
dt.Tick += myEventHandler2
这是正确的方法吗?
在此之前我应该检查dt.Tick是否为空吗?
从dt.Tick事件中删除所有eventHandler的最佳方法是什么?
我使用.net 3.5
非常感谢你的帮助
答案 0 :(得分:2)
在添加或删除事件处理程序之前,您无需检查是否为null,但是执行需要在引发事件之前检查是否为null。
为了删除所有事件处理程序,您必须手动删除事件处理程序,或者使用反射自动编写函数。
private void RemoveHandlers(DispatcherTimer dispatchTimer)
{
var eventField = dispatchTimer.GetType().GetField("Tick",
BindingFlags.NonPublic | BindingFlags.Instance);
var eventDelegate = (Delegate) eventField.GetValue(dispatchTimer);
var invocatationList = eventDelegate.GetInvocationList();
foreach (var handler in invocatationList)
dispatchTimer.Tick -= ((EventHandler) handler);
}
在委托的上下文中,您只需指定null
即可从链中删除所有处理程序,但事件本身就会阻止此操作。