在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(...);?
我想知道的是,我是否应该将我的所有活动创作更改为Invoke,因为它与Raise()的工作方式不同,或者它是否相同?
答案 0 :(得分:3)
您应该从未使用过该方法。这太复杂了。相反,这样的事情会更好:
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)
完全相同,除非没有额外的方法调用)。