c#事件创建:Raise vs invoke

本文关键字:vs invoke Raise 事件 创建 | 更新日期: 2023-09-27 18:08:19

在c# 6之前,我使用这个例程来处理多线程程序中的生成事件:(我在某处找到了它,但不记得在哪里):

 public static object Raise(this MulticastDelegate multicastDelegate, object sender, EventArgs e)
    {
        object retVal = null;
        MulticastDelegate threadSafeMulticastDelegate = multicastDelegate;
        if (threadSafeMulticastDelegate != null)
        {
            foreach (Delegate d in threadSafeMulticastDelegate.GetInvocationList())
            {
                var synchronizeInvoke = d.Target as ISynchronizeInvoke;
                if ((synchronizeInvoke != null) && synchronizeInvoke.InvokeRequired)
                    retVal = synchronizeInvoke.EndInvoke(synchronizeInvoke.BeginInvoke(d, new[] { sender, e }));
                else
                    retVal = d.DynamicInvoke(sender, e);
            }
        }
        return retVal;
    }

所以我所要做的就是eventname。raise(…,....)

现在在c# 6中,我知道新的是使用这样的东西:Eventname ? .Invoke(…),

我想知道的是,我是否应该改变我所有的事件创建调用,因为它的工作方式不同于Raise(),或者它是相同的事情?

c#事件创建:Raise vs invoke

一开始就不应该使用这个方法。这太复杂了。相反,这样做会更好:

public static void Raise(this Delegate handler, object sender, EventArgs e)
{
    if (handler != null)
    {
        handler.DynamicInvoke(sender, e);
    }
}

至于你是否应该改变你的事件引发代码,我认为不应该。除非你有很多时间可以消磨,并且喜欢遍历整个代码库,替换完美的代码。

应该做的是修复你当前的Raise()方法。对于任何新的代码,可以自由地以新的c# 6方式编写,即MyEvent?.DynamicInvoke(this, EventArgs.Empty)(使用上述方法实际上相当于MyEvent.Raise(this, EventArgs.Empty),除了没有额外的方法调用)。