6、為了能向所有人報告工作,可以使用事件
把彼得的worker類的的委託字段做成public有無意識的***。如果彼得的老闆不耐煩了,也可以決定自己來激發彼得的委託(真是乙個粗魯的老闆):
if( peter.completed != null ) peter.completed();
彼得不想讓這些事發生,他意識到需要給每個委託提供「註冊」和「反註冊」功能,這樣監聽者就可以自己新增和移除委託,但同時又不能清空整個列表也不能隨意激發彼得的事件了。彼得並沒有來自己實現這些功能,相反,他使用了event關鍵字讓c#編譯器為他構建這些方法:
using system;
delegate void workstarted();
delegate void workprogressing();
delegate int workcompleted();
class worker
}public event workstarted started;
public event workprogressing progressing;
public event workcompleted completed;
}class boss
}class family
}class universe
public static void workprogressing()
public static int workcompleted()
}class a
}
7、這時候,彼得終於可以松一口氣了,他成功地滿足了所有監聽者的需求,同時避免了與特定實現的緊耦合。但是他注意到他的老闆和宇宙都為他的工作打了分,但是他僅僅接收了乙個分數。面對多個監聽者,他想要收穫所有的結果,於是他深入到**裡面,輪詢監聽者列表,手工乙個個呼叫:
using system;
delegate void workstarted();
delegate void workprogressing();
delegate int workcompleted();
class worker}}
public event workstarted started;
public event workprogressing progressing;
public event workcompleted completed;
}class boss
}class family
}class universe
public static void workprogressing()
public static int workcompleted()
}class a
}
8、同時,他的老闆和宇宙還要忙於處理其他事情,也就是說他們給彼得打分所花費的時間變得非常長,很不幸,彼得每次通知乙個監聽者後必須等待它給自己打分,現在這些通知花費了他太多的工作時間。於是他決定忘掉分數,僅僅非同步激發事件:
public void dowork( )
}}
9、這使得彼得可以通知他的監聽者,然後立即返回工作,讓程序的執行緒池來呼叫這些**。隨著時間的過去,彼得發現他丟失了他工作的反饋,他知道聽取別人的讚揚和努力工作一樣重要,於是他非同步激發事件,但是周期性地輪詢,取得可用的分數。
public void dowork( )
}}
10、不幸地,彼得又回到了一開始就想避免的情況中來,比如,老闆站在背後盯著他工作。於是,他決定使用自己的委託作為他呼叫的非同步委託完成的通知,讓他自己立即回到工作,但是仍可以在別人給他的工作打分後得到通知:
public void dowork()
}} private void workgraded(iasyncresult res)
11、彼得、他的老闆和宇宙最終都滿足了。彼得的老闆和宇宙可以收到他們感興趣的事件通知,減少了實現的負擔和非必需的往返「差旅費」。彼得可以通知它們,而不管他們要花多長時間來從目的方法中返回,同時又可以非同步地得到他的結果。彼得知道,這並不十分簡單,因為當他非同步激發事件時,方法要在另外乙個執行緒中執行,彼得的目的方法完成的通知也是一樣的道理。但是,邁克和彼得是好朋友,他很熟悉執行緒的事情,可以在這個領域提供指導。
他們永遠幸福地生活下去。。。
C 11多執行緒(2)
多執行緒的建立方法 一 函式指標形式 將執行緒函式的函式名 函式指標 作為執行緒物件的引數進行建立執行緒,如果執行緒函式有引數,將引數按順序傳入執行緒物件,如下所示 三 lamda函式 include include using namespace std int main cout main th...
C 11學習筆記2之vector
include include include using namespace std int main vb有1個元素,值為10 vectorvc 10,1 vc有10個元素,每乙個的值為1 vectorvd vd有2個元素,分別為10,1 return 0 是用來構造vector物件的 是用來列...
C 11的新特徵
c 11對從前的語言做了很大的擴充套件,在我的感覺來看,加入了很多類似於python的語法,在以前嚴謹完整的基礎上增加了便捷性,更加人性化了,這裡摘取一部分書上提到的新特徵,做乙個讀書筆記。1.使用auto自動宣告變數或者物件 比如說 auto i 42 i has type int double ...