您好,登錄后才能下訂單哦!
上一篇我們了解到了,委托的基本感念,列舉了幾個委托的實(shí)例,并根據(jù)實(shí)例來反編譯源碼查看.NET 委托的內(nèi)部實(shí)現(xiàn),從淺入深的角度來詳細(xì)的去解析委托的實(shí)質(zhì),本文將系上篇繼續(xù)討論異步委托的實(shí)現(xiàn)以及異步委托的源碼解析。
首先本文只會從委托的層面的去編寫,不會涉及到深層次的異步.(后續(xù)的系列中將會對異步進(jìn)行深入講解.敬請關(guān)注.).
在上一篇中我們在實(shí)例中是直接通過委托對象的,例如:
private static void Main(string[] args) { Program.MyPersonDelegate personDelegate = new Program.MyPersonDelegate(Person.GetPersonName); personDelegate("Static"); }
點(diǎn)擊personDelegate查看:
// FuncActionDemo.Program.MyPersonDelegatepublic virtual extern void Invoke(string name);
我們可以看到委托對象的默認(rèn)調(diào)用方式是Invoke(同步調(diào)用).另外我們將它進(jìn)行反編譯查看一下 :
我們可以看到委托對象有void Invoke , System.IAsyncResult BeginInvoke,void EndInvoke . 這三個構(gòu)造函數(shù),我們下面先解釋一下這三個構(gòu)造:
Invoke : 委托回調(diào)函數(shù)時候的一種同步調(diào)用方式.
BeginInvoke : 委托回調(diào)函數(shù)時候的一種異步調(diào)用方式.和Invoke對立
EndInvoke : 異步調(diào)用,用于檢索調(diào)用結(jié)果.
在IT,特別是編程界,概念往往是不容易理解的,當(dāng)然除非你是具備超強(qiáng)的功底.否則還是通過實(shí)例來驗(yàn)證一下為好:
public delegate void delegateTest(string str);static void Main(string[] args) { delegateTest test = new delegateTest(GetIntance); IAsyncResult result = test.BeginInvoke("這是異步執(zhí)行的", null, null); test.EndInvoke(result); Console.WriteLine("這是同步執(zhí)行的"); Console.ReadLine(); //test.BeginInvoke("", new AsyncCallback((result) => Console.WriteLine("")), null); //Console.WriteLine(@"異步執(zhí)行的同時并沒有影響我的執(zhí)行"); //Console.WriteLine(@"異步執(zhí)行的同時并沒有影響我的執(zhí)行2"); //Console.ReadLine();}private static void GetIntance(string str) { Console.WriteLine(str); }
在上述代碼中,我們聲明了一個委托delegateTest, 和一個靜態(tài)方法GetIntance并有一個string類型的形參, 然后在Main函數(shù)中,我們創(chuàng)建了一個委托實(shí)例,并回調(diào)了GetIntance,通過委托實(shí)例的BeginInvoke來異步執(zhí)行GetIntance,通過BeginInvoke的第一個參數(shù)為GetIntance的實(shí)參( 注意:BeginInvoke的參數(shù),最后兩個分別為 : CallBack,Object,然后首個參數(shù)更明確的說是BeginInvoke的參數(shù)根據(jù)委托類型的的參數(shù)而定. )之后我們在通過test.EndInvoke(result);來判斷異步是否執(zhí)行完成,前面我們說過EndInvoke的作用就是用來判斷BeginInvoke是否執(zhí)行完成,如果執(zhí)行完成才繼續(xù)執(zhí)行下一步如果沒有完成則等待.,通過如果我們將EndInvoke去掉,那么最后調(diào)用的結(jié)果肯定為 : "這是同步執(zhí)行的" --> "這是異步執(zhí)行的" . 那么我們加上EndInvoke的話最后的輸出結(jié)果為:"這是異步執(zhí)行的" --> "這是同步執(zhí)行的"; ( 如果大家有異步的概念,對于這個其實(shí)很好了解的,關(guān)于異步在接下來的系列中會著重編寫. ,首先異步和并發(fā)是密不可分的,其次在目前的研發(fā)中來講并行編程也是提高生產(chǎn)效率的一種可行性方式,最后微軟在C#5.0中對與并發(fā)/異步編程的方式進(jìn)行了簡化,也可以理解為語法糖更豐富了).
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。