回調函數

回調函數異步

A 讓 B 排序,B 會作排序,但排序須要知道哪一個比哪一個大,這點 B 本身不知道,就須要 A 告訴它。而這種判斷大小自己是一種方法(函數),這個函數指針就是 A 傳向 B 的信息,用來表示一個行爲。這裏原本 A 調用 B 的,結果 B 又調用了 A 要它告訴方法的信息,也就叫 callback。


如下是引用:

函數能夠理解爲一個功能體,執行它能夠完成一個任務。
回調函數本質上就是一個函數,只是執行時間和執行主體與普通的函數稍有區別。函數

-----舉個例子的分割線------------
你去食堂打飯,你喜歡吃小炒熱飯菜,因此你去了一個小炒窗口。
你跟老闆說了要×××蓋飯,老闆說:你是100號,喊到你的號你就來拿菜。
而後你在旁邊跟同窗吹牛、或者看手機、或者乾點你想幹的任何事情。。。
而後你聽到老闆喊100號而且把菜放到窗口,你走到窗口,拿到你的菜。學習

這裏面就有典型的異步操做、回調函數的概念。線程

-----下面很煩的分割線------------
好吧,先搞清楚一些問題再回頭分析指針

回調函數在什麼場景有用?
我要在特定時候執行一個任務,至因而何時我本身都不知道。好比某一時間到了或者某一事件發生或者某一中斷觸發。對象

回調函數怎麼起做用?
把我要執行的這個任務寫成一個函數,將這個函數和某一時間或者事件或者中斷創建關聯。當這個關聯完成的時候,這個函數華麗的從普通函數變身成爲回調函數。排序

回調函數何時執行?
當該回調函數關心的那個時間或者事件或者中斷觸發的時候,回調函數將被執行。
通常是觸發這個時間、事件或中斷的程序主體(一般是個函數或者對象)觀察到有一個關注這個東東的回調函數的時候,這個主體負責調用這個回調函數。進程

回調函數有什麼好處?
最大的好處是你的程序變成異步了。也就是你沒必要再調用這個函數的時候一直等待這個時間的到達、事件的發生或中斷的發生(萬一一直不發生,你的程序會怎麼樣?)。再此期間你能夠作作別的事情,或者四處逛逛。當回調函數被執行時,你的程序從新獲得執行的機會,此時你能夠繼續作必要的事情了。事件

回調函數有什麼問題嗎?
既然有人問,固然就會有點問題。一個是學習成本會比普通函數高,須要有必定的抽象思惟能力,須要對應用場景的理解。另外一個是回調函數不少狀況下會附帶有跨線程操做甚至於跨進程的操做,這些都是異步帶來的成本。回調函數


-----回調分析的分割線------------
你去食堂打飯,你喜歡吃小炒熱飯菜,因此你去了一個小炒窗口。
你跟老闆說了要×××蓋飯,老闆說:你是100號,喊到你的號你就來拿菜。
而後你在旁邊跟同窗吹牛、或者看手機、或者乾點你想幹的任何事情。。。
而後你聽到老闆喊100號而且把菜放到窗口,你走到窗口,拿到你的菜。

這裏面有幾個函數:
老闆的部分:
一、老闆提供一個點餐的函數 boss.Order(string 菜名,double 錢)
二、老闆有個作飯的函數,此函數耗時較長boss.Cook()
三、老闆提供一個事件,當boss.cook()執行完時,該事件被觸發,boss.OnCookFinish;

你的部分:
一、你須要有一個函數去訂餐,也就是你的函數中須要執行相似於boss.Order("紅燒肉蓋澆飯",20),好比是me.Hungry()
二、你須要有一個函數做爲回調函數去關注boss.OnCookFinish事件,這樣當老闆作好飯,你就能夠知道是否是你的好了。
因爲老闆的事件發生的時候中會喊編號而且吧菜放到窗口,因此你的回調函數須要可以接受1個編號和1個菜做爲參數。
好比me.AcceptFood(int currNumber,object food)

因此整個程序的流程實際上是這樣的。
me.Hungry(){
boss.Order("紅燒肉蓋澆飯",20);
boss.OnCookFinish+=me.AcceptFood;//此處表面,AcceptFood這個回調函數關心OnCookFinish事件,而且變成這個事件的回調函數
//此時這個函數執行完,再也不等待
}

boss.Order("紅燒肉蓋澆飯",20){
//收錢
//配菜 前2個耗時較短
boss.Cook();//此處通常會開新線程執行cook動做
}

boss.Cook(){
//cooking~~~~~~~~~~
//完成了,下面將要觸發事件,系統將檢查這個事件是否有回調函數關心,有的話逐個回調。
OnCookFinish(100號,紅燒肉蓋澆飯);
}

至此案例基本完成了一個完整的任務流程。


======最終總結的分割線==========回調函數在異步處理過程當中的一個必要手段。目的是讓me不須要等boss的長時間操做,能夠在這段時間作點別的事情。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息