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)
的完全相同的东西,除非没有额外的方法调用)。
在 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)
的完全相同的东西,除非没有额外的方法调用)。