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(),或者它是相同的事情?
一开始就不应该使用这个方法。这太复杂了。相反,这样做会更好:
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)
,除了没有额外的方法调用)。