1

在我的应用程序中,我有 dispatcherTimer 和一些在 dispatcherTimer.Tick 事件上使用的 eventHandler:

dt.Tick += myEventHandler1

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

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

这是正确的方法吗?

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

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

我使用.net 3.5

非常感谢您的帮助

4

1 回答 1

2

您无需在添加或删除事件处理程序之前检查是否为空,但是您确实需要在引发事件之前检查是否为空。

为了删除所有事件处理程序,您必须像已经拥有的那样手动删除事件处理程序,或者使用反射编写一个函数来自动执行此操作。

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以便从链中删除所有处理程序,但是事件本身会阻止这种情况。

于 2013-10-23T17:03:30.850 回答