委託、多播委託(MulticastDelegate) 委託、多播委託(MulticastDelegate)

委託、多播委託(MulticastDelegate)

        多播委託(MulticastDelegate)繼承自 Delegate ,表示多路廣播委託;即,其調用列表中能夠擁有多個元素的委託。實際上,咱們自定義的委託的基類就是 MulticastDelegate。html

       在 C 或 C++ 中與委託最爲類似的是函數指針。委託能夠表示靜態方法或實例方法。當委託表示實例方法時,委託不只存儲對方法入口點的引用,還存儲對類實例的引用。與函數指針不一樣,委託是面向對象和類型安全的。安全

        多播委託具備一個帶有連接的委託列表,稱爲調用列表,在對委託實例進行調用的時候,將按列表中的委託順序進行同步調用。ide

       在實際應用中,若是咱們要改變一般的事件廣播的方式時,就須要應用這一特性了。好比一般咱們都是這樣觸發一個事件廣播:函數

       方法 MyEventMethod1 和 MyEventMethod2 將前後被調用。post

 

       但是,在上面定義的委託 MyEventHandle 是有返回值的,上面的方式調用(string result = MyEvent("John");)以後返回的是哪個方法的返回值呢?固然是最後一個 MyEventMethod2 。url

 

       但若是咱們須要得到全部方法的返回值該怎麼辦?spa

       還有,假如在調用 MyEventMethod1 時方法內部拋出異常,這將致使後面的方法沒法獲得執行。那咱們若是要求無論被調用的方法不管是否拋出錯誤,都要保證列表中的全部方法必須獲得調用,那該怎麼辦?指針

 

       針對這兩種場景,咱們就得本身實現對多播委託的調用列表中的每一個委託進行逐個調用了。code

       Delegate 的API中提供了一個方法供咱們得到調用列表:htm

    

            經過逐個調用委託便可:

 

Delegate[] delegList = MyEvent.GetInvocationList();
List<string> resultList = new List<string>();
foreach (MyEventHandle del in delgtList)
{
try
{
resultList.Add(del("John"));
}
catch (Exception ex)
{
//異常處理;
}
}
複製代碼

 

 public override sealed Delegate[] GetInvocationList()

 

複製代碼
事件觸發代碼
public delegate string MyEventHandle(string name);

public static event MyEventHandle MyEvent;

static void Main(string[] args)
{
MyEvent += new MyEventHandle(MyEventMethod1);
MyEvent += new MyEventHandle(MyEventMethod2);
MyEvent("John");
}
複製代碼
相關文章
相關標籤/搜索