c# 事件创建 : Raise vs invoke

标签 c# events invoke raise

在 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() 方法。并随意使用任何代码以新的 C# 6 方式编写它,即 MyEvent?.DynamicInvoke(this, EventArgs.Empty)(实际上相当于完全相同像 MyEvent.Raise(this, EventArgs.Empty) 使用上面的东西,除了没有额外的方法调用。

关于c# 事件创建 : Raise vs invoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39651328/

相关文章:

c# - 如何在组合框中设置默认空值

c# - 加载新的 WPF/C# 窗口时触发的最后一个事件是什么?

C#调用方法参数空引用异常

java - 创建一个带有 Swing 提交按钮的表单面板

asp.net - Gridview RowUpdating 事件未触发

java - 我想打印 hi GrandFather;但它似乎打印 hi Father

windows - 调用已释放的 COM 对象

c# - 仅在需要时加载类的 byte[] 属性

c# - 如何将 LINQ 支持添加到我的库中?

c# - 插入带有参数的多行 Sql Server