C# 在Dispatchermer tick事件的事件处理程序之间切换

C# 在Dispatchermer tick事件的事件处理程序之间切换,c#,.net,wpf,events,C#,.net,Wpf,Events,在我的应用程序中,我有Dispatchermer和一些我在Dispatchermer上使用的EventHandler。勾选事件: dt.Tick += myEventHandler1 当我想切换勾号的事件处理程序时,我会使用如下内容: dt.Tick -= myEventHandler1 dt.Tick += myEventHandler2 这是正确的方法吗 在此之前我是否应该检查dt.Tick是否不为null 另外,从dt.Tick事件中删除所有EventHandler的最佳方法是什么 我

在我的应用程序中,我有Dispatchermer和一些我在Dispatchermer上使用的EventHandler。勾选事件:

dt.Tick += myEventHandler1
当我想切换勾号的事件处理程序时,我会使用如下内容:

dt.Tick -= myEventHandler1
dt.Tick += myEventHandler2
这是正确的方法吗

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

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

我使用.NET3.5


非常感谢您的帮助

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

为了删除所有事件处理程序,您必须手动删除事件处理程序,就像您已经手动删除事件处理程序一样,或者编写一个函数来使用反射自动删除事件处理程序

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

intellisense说:事件勾号只能出现在+=或-=@gruber的左侧是的,您不能只将一个委托分配给事件,它只需要是一个委托(这意味着创建您自己的
计时器
,或计时器上的包装器),答案是这样的。在这种情况下,虽然你不需要这样做,但你可以做你正在做的事情。@Servy我在他的评论之后编辑了这个问题。原来是我犯的错误。@gruber是我的错。我原来的答案有点混乱,但后来我更新了答案。这回答了你的问题吗?