淺學C (11) 彼得的故事(2)

2021-09-10 03:40:09 字數 2211 閱讀 7504

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 ...