在dispatcherTimer tick事件的事件处理程序之间切换

时间:2013-10-23 16:56:43

标签: c# .net wpf events

在我的应用程序中,我有dispatcherTimer和几个eventHandlers,我在dispatcherTimer.Tick事件中使用:

dt.Tick += myEventHandler1

当我想切换tick的事件处理程序时,我会使用这样的:

dt.Tick -= myEventHandler1
dt.Tick += myEventHandler2

这是正确的方法吗?

在此之前我应该​​检查dt.Tick是否为空吗?

从dt.Tick事件中删除所有eventHandler的最佳方法是什么?

我使用.net 3.5

非常感谢你的帮助

1 个答案:

答案 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即可从链中删除所有处理程序,但事件本身就会阻止此操作。