在 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/