[英]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,我知道新的是使用類似的東西:Eventname?.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)
完全相同MyEvent.Raise(this, EventArgs.Empty)
以上,除非沒有額外的方法調用)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.