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