c# 事件创建:引发与调用

c# Event Creation: Raise vs invoke

在 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,我知道新的是使用类似的东西: 事件名称?.Invoke(...);

我想知道的是,我是否应该将我所有的事件创建更改为 Invoke,因为它的工作方式与 Raise() 不同,还是相同?

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

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

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

应该 做的是修复当前的 Raise() 方法。并随意使用任何 new 代码以新的 C# 6 方式编写它,即 MyEvent?.DynamicInvoke(this, EventArgs.Empty)(这实际上相当于使用上述 MyEvent.Raise(this, EventArgs.Empty) 的完全相同的东西,除非没有额外的方法调用)。